当前位置 : 主页 > 网络推广 > seo >

haskell – 使用Maybe’s从ADT链中检索值

来源:互联网 收集:自由互联 发布时间:2021-06-16
我有一些ADT,每个ADT可能包含或不包含另一个ADT.我需要从较低级别检索数据,并且我正在编写一些非常重复的代码,我相信这些代码可以被删除.我已经看了一下Real World Haskell中的一些示例
我有一些ADT,每个ADT可能包含或不包含另一个ADT.我需要从较低级别检索数据,并且我正在编写一些非常重复的代码,我相信这些代码可以被删除.我已经看了一下Real World Haskell中的一些示例代码以及“了解大好的Haskell”,但我无法弄明白.这是一个例子,其中遗漏了ADT的无关细节.

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

这正是前一个示例在编译期间转换为的内容.通常那种人工贬值会让事情变得更糟,而不是更好.但在这种情况下,我很想接受这个,只是因为它的行数较短,而且读取的工作量也不多.

网友评论