我想要一个类型为以下的函数:
例如。
它类似于
或者
f :: [Maybe a] -> Maybe [a]
例如。
f [Just 3, Just 5] == Just [3, 5]
f [Just 3, Nothing] == Nothing
f [] == Just []
它类似于
Data.Maybe
中的catMaybes :: [Maybe a] -> [a]
,但是catMaybes
会忽略Nothing
,而我的f
非常关注Nothing
。我可以以一种简单的方式实现f
(如下所示),但想知道是否有更惯用的方式(比如“应用函子”):f :: [Maybe a] -> Maybe [a]
f xs = let ys = catMaybes xs
in if length ys == length xs
then Just ys
else Nothing
或者
f :: [Maybe a] -> Maybe [a]
f xs = if all isJust xs
then catMaybes xs
else Nothing
length
(特别是如果你使用了多次),那么你可能做错了某些事情。在 Haskell 中,它并不适用于大多数列表代码。这并非总是如此,但在学习过程中,你应该避免使用它。 :-) - shachaf[Maybe a] -> Maybe [a]
并找到了正确答案sequence
。请参考。 - aaronlevinhoogle
进行了搜索,发现了catMaybes
。sequence
是列表中的第一个结果。由于其类型不是Maybe
而是Monad
,我忽略了它,并未意识到它们之间的联系。 - Causality