Haskell列表理解中的非详尽模式

时间:2012-07-30 22:03:18

标签: haskell list-comprehension

  

可能重复:
  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

1 个答案:

答案 0 :(得分:2)

我认为that other question中的最佳答案实际上是引用“编译魔术”的答案。您匹配模式Just x,并根据Haskell 2010 Report将行为指定为

  

..如果匹配失败,则只会跳过列表中的该元素。

所以我认为实施可以随心所欲地做到这一点(即,贬义不一定是唯一的。)