使用Maybe遍历嵌套记录的更短方法

时间:2017-04-10 04:11:45

标签: haskell lens lenses

是否有更短/更清晰的方式来编写以下代码片段:

fromMaybe "" $ fmap (^. fullName) (bi ^. bookerContact)

此处bi ^. bookerContact可能会生成Maybe Contact条记录,这就是^. fullName需要fmap的原因。在嵌套遍历之后,如果我们最终得到Nothing,我们会使用fromMaybe ""将其默认为空字符串。

1 个答案:

答案 0 :(得分:5)

一种简单的整理方法是使用END代替$ awk 'NR==FNR{a[$1]=$0;next}{print $0;delete a[$1]}END{for(i in a) print a[i]}' old new Name Size Date ================== A 24mb 2/10 C 30mb 2/10 B 10mb 1/10 / maybe组合:

fromMaybe

您还可以引入fmap棱镜来表达所有钻孔作为单个光学元件:

maybe "" (^. fullName) (bi ^. bookerContact)

请注意,我们已从_Just切换为fromMaybe "" (bi ^? bookerContact . _Just . fullName) 。这反映了如何将(^.)添加到链中,将以前的镜头(并准确到达一个目标)更改为遍历(可能无法达到目标)。

也可以利用(^?)作为幺半群,并使用_Just中的Text ...

fold

...或foldOf,如果您更喜欢镜头拼写:

Data.Foldable

正如文档所指出的那样,fold (bi ^? bookerContact . _Just . fullName) 相当于foldOf (bookerContact . _Just . fullName) bi (即foldOf专门用于(^.)),所以这也可以通过折叠{{1}来实现}}:

view