【发布时间】:2013-01-25 19:13:12
【问题描述】:
我有一些 ADT,每个 ADT 可能包含也可能不包含另一个 ADT。我需要从较低级别检索数据,并且我正在编写一些非常重复的代码,我确信这些代码可以被消除。我在 Real World Haskell 和“Learn You a Haskell For Great Good”中查看了一些示例代码,但我不太明白。这是一个与 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 上找不到类似的问题,但我相信它一定在这里......这似乎是一个必须被问到的简单问题。
谢谢, 蒂姆
【问题讨论】:
-
听起来你应该使用
Maybe作为单子。 -
看看
maybe函数,案例分析,以及Maybe的Monad/Applicative实例。就个人而言,我很少使用isNothing或fromJust。 -
谢谢——我会去重新阅读有关 monad 的信息,看看我是否能理解它。
-
Control.Lens 库(或一般的镜头)在这种情况下可能非常有用,尤其是在您想要更改嵌套记录时。从内到外重构一个新的类型实例来表示变化是很乏味的。
-
我会调查的,谢谢@MFlamer。