如何处理Haskell列表推导中的Maybe类型

4
我在Haskell中使用了一个列表推导式,对Maybe类型指定了一个谓词: [x | x <- listOfMaybes, isJust(f y), x == fromJust(f y)] 是否有一种简化这个表达式的方法?

1
请提供一个完全可用的示例。没有 <-,这不是列表推导式,我怀疑它是否能编译。 - Franky
更新了代码片段。 - Rich Ashworth
1
我认为列表推导式中的 x==fromJust(f y) 是不必要的。在 isJust(f y) 的条件下就可以完成任务。 - Stephan
2个回答

17

如果你只想过滤掉所有的 Nothing,shang 的答案提供了最简洁的解决方案。然而,也可以轻松地使用列表推导式来完成:

如果您只想过滤掉所有的Nothing,shang的答案提供了最简洁的解决方案。但是,它也可以在列表推导式中轻松完成:
[x | Just x <- f y]

2
你可能需要解释一下,这实际上是 flip concatMap (f y) $ \result -> case result of {Just x -> [x]; {-Implicitly added!-} _ -> []} - dfeuer
1
没错,我发现在列表推导式中学习模式匹配是完全有效的,并且会自动过滤掉不匹配的情况,这样更容易理解。我觉得你的展开并没有增加清晰度 :-) - Stephan
有趣的是,这里的行为与在do符号中进行模式匹配时不同,在那里Just x <- f y可能会出错。 - JonnyRaa
这与使用符号表示法并没有什么不同,因为 List 的单子实例控制着如何处理模式匹配错误。在 List 中,错误被简单地忽略了。由于 MonadFail 提案的出现,这种情况可能最近发生了变化,但我不确定。 - Stephan

14

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接