可能重复:
Why don't Haskell list comprehensions cause an error when pattern match fails?
今天我看到了以下代码:
Prelude> [a | Just a <- [Just 10, Nothing, Just 20]]
[10, 20]
有效。但我认为上面的列表理解只是......的语法糖。
[Just 10, Nothing, Just 20] >>= (\(Just x) -> return x)
...遇到Nothing
时,Haskell会发出错误*** Exception: Non-exhaustive patterns in lambda
。
所以我的问题是:[a | Just a <- [Just 10, Nothing, Just 20]]
转化为(根据monadic代码)使其忽略Nothing
?
答案 0 :(得分:2)
我认为that other question中的最佳答案实际上是引用“编译魔术”的答案。您匹配模式Just x
,并根据Haskell 2010 Report将行为指定为
..如果匹配失败,则只会跳过列表中的该元素。
所以我认为实施可以随心所欲地做到这一点(即,贬义不一定是唯一的。)