【发布时间】:2019-04-29 02:41:13
【问题描述】:
我有一个我应该这样定义的函数:
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],...]
如果我在fmap 返回列表中使用sequence,它将遵循上述规则(如果列表中的任何内容是Nothing,则返回Nothing),这很棒。除了它返回一个像这样的列表:
只要 [[1],[2]]
这不是我需要的格式。在那种情况下,我需要它是:
只是 [1,2]
当我刚开始学习 Haskell 时,monad 对我来说仍然是一个新鲜的话题,我在弄清楚如何格式化这个列表或者是否有更好的方法来解决这个问题时遇到了一些麻烦。我无法更改函数类型签名。
【问题讨论】:
-
如果没有
Maybe存在,您将如何展平列表?