[英]Haskell, traversable getting values from Maybe [list]
发现需要使用Traversable
。 它返回了一个像这样生成的列表: fReplList = Just [2,4..100]
。
我知道如何在列表中返回Maybe
值,例如: [Just 1, Just 2, Nothing]
,但是我不知道如何对Maybe-list进行模式匹配,例如: Just [2,4,6,8..100]
。 我是一个初学者(仍然),感到难过,但我仍在解决这些基本问题,但是也许您可以提供帮助。
您可以在Maybe [Int]
上进行模式匹配,就像在任何Maybe a
上进行模式匹配一样:
foo (Just x) = x
foo Nothing = -- ?
问题是: 在“无”案件中您还会得到什么? (要清楚,上面的代码片段无法编译,因为在Nothing
情况下foo
不返回任何内容。)
有时,您可以决定对Just
内的x
做某事,然后将结果放回Just
案例中:
map' f (Just x) = Just (f x)
map' _ Nothing = Nothing
这正是fmap
已经为Maybe a
,这就是为什么我将示例函数map'
命名为map'
。 使用fmap
,可以这样映射Maybe [Int]
:
Prelude> fmap show (Just [2,4,6,8,100])
Just "[2,4,6,8,100]"
注意,这会将整个列表转换为String
,因为fmap
适用于Maybe
,而不适用于[]
。
通常,很难说在Nothing
情况下返回Nothing
,对于列表(和其他类半体),自然存在一个“默认值”。 因此,专门针对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
进行展平。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.