【问题标题】:Flattening a list of Maybe elements from Just [[x1],[x2]] to Just [x1,x2]将 Maybe 元素列表从 Just [[x1],[x2]] 展平为 Just [x1,x2]
【发布时间】: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 存在,您将如何展平列表?

标签: haskell monads


【解决方案1】:

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

另外,请注意,任何时候您对mapfmap<$> 的结果调用sequence(或sequenceA),您都可以通过将两者组合成mapM(或traverse)。

【讨论】:

    猜你喜欢
    • 2015-06-04
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    • 2020-01-28
    • 2013-02-02
    • 2016-02-04
    • 1970-01-01
    相关资源
    最近更新 更多