这样的模式:
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以及为什么这些编译器的行为不同。
答案 0 :(得分:16)
这就是所谓的n+k
模式。一般来说它是disliked并从Haskell2010规范中删除,GHC不再默认启用它,而Hugs没有更新到最新规范。它应该与GHCI一起编译并启用-XNPlusKPatterns
标志。
有关详细信息,请参阅this。
答案 1 :(得分:9)
在haskell 98中这是合法的,但它在haskell 2010中被禁止,这是最近版本的GHC实现的。另一方面,拥抱多年来没有更新,并且实现了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:我相信一切都始于this email thread。