Cau*_*ity 5 haskell functor applicative
我想要一个类型的函数:
f :: [Maybe a] -> Maybe [a]
Run Code Online (Sandbox Code Playgroud)
例如
f [Just 3, Just 5] == Just [3, 5]
f [Just 3, Nothing] == Nothing
f [] == Just []
Run Code Online (Sandbox Code Playgroud)
这是一个类似catMaybes :: [Maybe a] -> [a]的Data.Maybe,不同之处在于catMaybes忽略了Nothing,而我的f是关于十分严重Nothing.我可以f以一种天真的方式实现(如下所示),但想知道是否有更多的惯用方式(如"applicative functor"):
f :: [Maybe a] -> Maybe [a]
f xs = let ys = catMaybes xs
in if length ys == length xs
then Just ys
else Nothing
Run Code Online (Sandbox Code Playgroud)
要么
f :: [Maybe a] -> Maybe [a]
f xs = if all isJust xs
then catMaybes xs
else Nothing
Run Code Online (Sandbox Code Playgroud)
ben*_*ofs 20
您要搜索的函数称为序列:
sequence :: (Monad m) => [m a] -> m [a]
Run Code Online (Sandbox Code Playgroud)
你可以使用hoogle:link找到这个功能.
例:
>>> sequence [Just 3, Just 5]
Just [3,5]
>>> sequence [] :: Maybe [Int]
Just []
Run Code Online (Sandbox Code Playgroud)
注意:Data.Traversable中还有sequenceA,它有点概括,但对于Control.Monad的用例序列就足够了.