2012-07-30 75 views
5

可能重复:
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时,会发出错误*** Exception: Non-exhaustive patterns in lambda

所以我的问题是:什么[a | Just a <- [Just 10, Nothing, Just 20]]翻译成(在一元代码方面),使其忽略Nothing

+0

@ephemient:谢谢!您链接的帖子回答我的问题。我发现[另一个](http://stackoverflow.com/questions/7007222/haskell-list-comprehension-to-combinatory)。我在发布我的问题之前没有找到这些帖子的原因是因为他们没有包含“穷举”这个词,这是Haskell的问题。 (我是StackOverflow的新手,我不知道应该怎么做,我应该删除这个问题吗?对于输入“[non-] exhaustive”的用户仍然有用。) – 2012-07-30 22:35:33

+0

You不需要删除 - 最终它会作为重复被关闭,这意味着将有大量的链接将人们从这里转移到下一个,并给出答案。而且,正如你注意到的,保持身边比杀死更有用:) – ephemient 2012-07-30 22:42:56

回答

2

我认为that other question中的最佳答案实际上就是引用'编译器魔术'的那个。你根据Haskell 2010 Report的行为规定为

..如果再匹配失败的列表只是跳过的那个元素匹配模式Just x和。

因此,我认为实现可以自由地按照自己的意愿去做(即,desugaring不一定是唯一的)。