繁体   English   中英

Haskell,可从Maybe获得可遍历的值[列表]

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM