算术模式是合法的Haskell吗?

bit*_*ask 9 haskell cross-platform compiler-errors ghc hugs

这样的模式:

front :: [a] -> a
front (x:_) = x
front _ = error "Empty list"
Run Code Online (Sandbox Code Playgroud)

似乎在Haskell中很常见,但我特别记得在我开始学习Haskell时学习以下内容:

dec :: (Integral a) => a -> a
dec (x+1) = x
dec _ = error "Bottom"
Run Code Online (Sandbox Code Playgroud)

但是,ghc似乎拒绝了那段代码,说明:

Parse error in pattern: x + 1

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

Abh*_*kar 16

这就是所谓的n+k模式.有人不喜欢,一般从Haskell2010规范取出并GHC不再启用它不像拥抱默认尚未更新到最新规范.它应该与GHCI一起编译并-XNPlusKPatterns启用标志.

有关详细信息,请参阅


scr*_*avy 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 #-}
Run Code Online (Sandbox Code Playgroud)

PS:我相信这一切都始于这个电子邮件主题.