haskell中的函数,像catMaybes,但有类型[也许一个] - >可能[a]

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的用例序列就足够了.


sha*_*haf 7

你想要sequenceControl.Monad.

(这也是一种有用的推广方式Data.Traversable.)