我有一些ADT,每个ADT可能包含或不包含另一个ADT.我需要从较低级别检索数据,并且我正在编写一些非常重复的代码,我相信这些代码可以被删除.我已经看了一下Real World Haskell中的一些示例
T24Report - projTitle :: Maybe ProjectTitle - zip :: Maybe String
要从StreetAddress检索邮政编码,我一直以此结束:
projNameStr :: T24Report -> String projNameStr t24 = if isNothing projTitleMaybe then "" else (fromMaybe "") $zip $fromJust projTitleMaybe where projTitleMaybe = projTitle $project t24
随着对象链的深度增加,代码的重复性也会增加.肯定有更好的办法.想法?参考文献?我在StackOverflow上找不到类似的问题,但我相信它一定在这里……这似乎是一个必须要问的简单问题.
谢谢,
蒂姆
projNameStr :: T24Report -> String projName t24 = fromMaybe "" $do title <- projTitle $project t24 zip title
关键是使用do块来分解处理所有Nothing案例.
但是,在这种特殊情况下,由于链中只有两个Maybes,我很想缩短它:
projNameStr :: T24Report -> String projName t24 = fromMaybe "" $projTitle (project t24) >>= zip
这正是前一个示例在编译期间转换为的内容.通常那种人工贬值会让事情变得更糟,而不是更好.但在这种情况下,我很想接受这个,只是因为它的行数较短,而且读取的工作量也不多.