首页 > 解决方案 > 如何将 [Maybe Text] 与镜头连接?

问题描述

有没有办法用镜头写下以下内容......

[Maybe Text] -> Text

...这可能可以概括为:

(Monoid a, Traversable t) => t a -> a

我正在尝试做的一个具体示例:

[Just "abc", Nothing, Just "def"] -> "abcdef"
[Nothing, Nothing] -> ""

PS:我假设镜头有一些时髦的组合器来做到这一点。如果我被镜头的美妙所蒙蔽,而这可以通过更简单的组合器轻松实现,请告诉我。

标签: haskelllenses

解决方案


您的(Monoid a, Traversable t) => t a -> a功能可以进一步推广到一个简单的fold :: (Foldable f, Monoid a) => f a -> a.

例如:

Prelude> import Data.Foldable
Prelude Data.Foldable> fold [Just "abc", Nothing, Just "def"]
Just "abcdef"

我们可以将其从以下内容中解开Maybe

import Data.Foldable(fold, mempty)
import Data.Maybe(maybe)

foldMaybe :: (Foldable f, Monoid a) => f (Maybe a) -> a
foldMaybe = fromMaybe mempty . fold

例如:

Prelude Data.Foldable Data.Maybe> foldMaybe [Just "abc", Nothing, Just "def"]
"abcdef"
Prelude Data.Foldable Data.Maybe> foldMaybe [Nothing] :: String
""

推荐阅读