Haskell,可遍历从 Maybe [list] 获取值

Haskell, traversable getting values from Maybe [list]

发现需要使用 Traversable。它 returned 这样的列表生成:fReplList = Just [2,4..100].

我知道如何 return Maybe 列表中的值,例如:[Just 1, Just 2, Nothing],但我不知道如何对可能列表进行模式匹配,例如:Just [2,4,6,8..100]。我(仍然)是初学者,在这些基本问题上我仍然 运行 感觉很糟糕,但也许你可以提供帮助。

您可以在 Maybe [Int] 上进行模式匹配,就像在任何 Maybe a 上进行模式匹配一​​样:

foo (Just x) = x
foo Nothing = -- ?

问题是:在 Nothing 情况下你return 做什么?(要清楚,上面的代码片段无法编译,因为 fooNothing 情况下 return 没有任何东西。)

有时,您可以决定对 Just 内部的 x 做一些事情,然后将结果放回 Just 案例中:

map' f (Just x) = Just (f x)
map' _ Nothing = Nothing

这正是 fmap 已经为 Maybe a 所做的,这就是我将示例函数命名为 map' 的原因。使用 fmap,您可以像这样映射 Maybe [Int]

Prelude> fmap show (Just [2,4,6,8,100])
Just "[2,4,6,8,100]"

请注意,这会将整个列表变成 String,因为 fmap 适用于 Maybe,而不适用于 []

虽然一般来说,很难说 return 在 Nothing 的情况下是什么,但对于列表(和其他幺半群)来说,自然 'default value' 存在。所以,专门针对 Maybe [a],你可以这样写:

maybeListToList :: Maybe [a] -> [a]
maybeListToList (Just xs) = xs
maybeListToList Nothing = []

使用它可能如下所示:

*Q54645038> maybeListToList (Just [2,4,6,8,100])
[2,4,6,8,100]
*Q54645038> maybeListToList Nothing
[]

但这并不是真正必要的,因为您可以将 Data.Maybe 和标准 Prelude 中的现有功能结合起来以获得相同的功能:

Prelude Data.Maybe> maybeToList (Just [2,4,6,8,100])
[[2,4,6,8,100]]
Prelude Data.Maybe> concat (maybeToList (Just [2,4,6,8,100]))
[2,4,6,8,100]
Prelude Data.Maybe> concat (maybeToList Nothing)
[]

注意 maybeToList 如何将任何 Maybe a 变成列表。当 a 已经是一个列表时,您会得到一个嵌套列表,然后您可以使用 concat.

将其展平