将Maybe元素列表从Just [[x1],[x2]]展平为Just [x1,x2]

wez*_*tex 4 monads haskell

我有一个应该这样定义的函数:

func :: (a -> Maybe [b]) -> [a] -> Maybe [b]
Run Code Online (Sandbox Code Playgroud)

一些应该如何工作的示例:

func (\x -> if x == 0 then Nothing else Just [x]) [1,2]
Run Code Online (Sandbox Code Playgroud)

应导致:

刚[1,2]

另一个例子:

func (\x -> if x == 0 then Nothing else Just [x]) [1,0]
Run Code Online (Sandbox Code Playgroud)

没有

如果列表中的任何内容为a Nothing,则函数返回Nothing。否则,如果列表中的所有元素都返回a,Just [x]那么它应该返回一个列表,如:Just [x1, x2, ...]

我尝试将fmap类似的调用用于上面的返回类似的内容:

[仅[1],仅[2],...]

如果我sequence在列表上使用fmapreturn,它将遵循上述规则(Nothing如果列表中的任何内容为a Nothing,则返回a ),这很棒。除了它返回这样的列表:

只是[[1],[2]]

这不是我需要的格式。在那种情况下,我需要它是:

刚[1,2]

当我刚开始学习Haskell时,monads仍然是我的新鲜话题,在确定如何格式化此列表或是否有解决此问题的更好方法时,我遇到了一些麻烦。我无法更改函数类型签名。

Jos*_*ica 9

要将清单[[1],[2]]变成[1,2],使用concat。在您的情况下,由于列表位于内Maybe,因此您需要对其进行调用fmap concat

另外请注意,您拨打的任何时间sequence(或sequenceA)上的结果mapfmap或者<$>,你可以都组合到保存功能mapM(或traverse)。