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

Nic*_* M. 5 haskell list-comprehension

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

今天我看到了以下代码:

Prelude> [a | Just a <- [Just 10, Nothing, Just 20]]
[10, 20]
Run Code Online (Sandbox Code Playgroud)

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

[Just 10, Nothing, Just 20] >>= (\(Just x) -> return x)
Run Code Online (Sandbox Code Playgroud)

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

所以我的问题是:什么[a | Just a <- [Just 10, Nothing, Just 20]]转化为(在monadic代码方面)使它忽略了Nothing?

jto*_*bin 2

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

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

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