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

时间:2019-04-29 02:41:13

标签: haskell monads

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

func :: (a -> Maybe [b]) -> [a] -> Maybe [b]

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

func (\x -> if x == 0 then Nothing else Just [x]) [1,2]

应导致:

  

仅[1,2]

另一个例子:

func (\x -> if x == 0 then Nothing else Just [x]) [1,0]
  

没事

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

我尝试使用fmap进行与上述类似的调用,返回的内容如下:

  

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

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

  

仅[[1],[2]]

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

  

仅[1,2]

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

1 个答案:

答案 0 :(得分:9)

要将[[1],[2]]之类的列表转换为[1,2],请使用concat。对于您而言,由于列表位于Maybe内,因此您需要在其上调用fmap concat

此外,请注意,每次您根据sequencesequenceAmap的结果调用fmap(或<$>)时,都可以保存通过将两者组合成mapM(或traverse)来实现功能。