9

像这样的模式:

front :: [a] -> a
front (x:_) = x
front _ = error "Empty list"

似乎在 Haskell 中很常见,但我清楚地记得当我开始学习 Haskell 时学习了以下内容:

dec :: (Integral a) => a -> a
dec (x+1) = x
dec _ = error "Bottom"

但是,ghc似乎拒绝了那段代码,并指出:

Parse error in pattern: x + 1

虽然hugs接受它就好了。那么,这是否有效的 Haskell 以及为什么这些编译器的行为不同。

4

2 回答 2

16

这就是所谓的n+k模式。它一般不受欢迎,已从Haskell2010规范中删除,GHC 默认不再启用它,这与尚未更新到最新规范的 Hugs 不同。它应该与启用标志的 GHCI 一起编译-XNPlusKPatterns

有关更多详细信息,请参阅内容。

于 2012-09-13T20:03:03.387 回答
9

在 haskell 98 中这是合法的,但在 haskell 2010 中被禁止,这就是最近版本的 GHC 实现的。另一方面,Hugs 多年未更新,并实现了 haskell 98。

不喜欢 n+k 模式,因为可能存在匹配的数字,例如n+1,但没有n适合的数字n+1

考虑浮点数:存在一个适合的数字n+1(4294967296 :: Float 是 4294967295 的 n+1,但这个数字不能适合浮点数——比较round (4294967296 :: Float)round (4294967295 :: Float),两者都产生 4294967296)。

你也可能有反弹+(haskell 支持运算符重载),那么模式匹配意味着什么?为了避免这种歧义,不允许使用 n+k 模式。

如果您仍然想使用 n+k 模式,您可以在源文件的顶部使用语言编译指示:

{-# LANGUAGE NPlusKPatterns #-}

PS:我相信这一切都是从这个电子邮件线程开始的。

于 2012-09-14T02:25:57.877 回答