算术模式是合法的Haskell吗?

时间:2012-09-13 19:46:54

标签: haskell compiler-errors cross-platform ghc hugs

这样的模式:

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以及为什么这些编译器的行为不同。

2 个答案:

答案 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