5

可能重复:
当模式匹配失败时,为什么 Haskell 列表推导不会导致错误?

今天看到如下代码:

Prelude> [a | Just a <- [Just 10, Nothing, Just 20]]
[10, 20]

有用。但我认为上面的列表理解只是...的语法糖

[Just 10, Nothing, Just 20] >>= (\(Just x) -> return x)

...为此,Haskell 在遇到 时Nothing会发出错误*** Exception: Non-exhaustive patterns in lambda

所以我的问题是:什么[a | Just a <- [Just 10, Nothing, Just 20]]翻译成(就一元代码而言)使它忽略Nothing?

4

1 回答 1

2

我认为另一个问题的最佳答案实际上是引用“编译器魔术”的答案。您正在匹配模式Just x,并且根据Haskell 2010 报告,行为被指定为

.. 如果匹配失败,则简单地跳过列表中的该元素。

因此,我认为实现可以随意执行此操作(即,脱糖不一定是唯一的)。

于 2012-07-30T22:55:46.243 回答