2012-09-13 22 views
9

模式是這樣的:算術模式是合法的Haskell?

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

不,它是無效的。 –

+0

@ДМИТРИЙМАЛИКОВ:那麼,爲什麼'擁抱'接受它? – bitmask

+2

@bitmask因爲擁抱自2006年以來還沒有發佈,並且在Haskell2010標準中刪除了'NPlusKPatterns'。 –

回答

16

這就是所謂的n+k模式。它一般是disliked,並且從Haskell2010規範中刪除,並且GHC不再允許它與不更新到最新規範的Hugs不同。它應該與GHCI一起編譯,啓用-XNPlusKPatterns標誌。

請參閱this瞭解更多詳情。

9

在haskell 98這是合法的,但它在2010年haskell被禁止,這是最新版本的GHC實現。在另一方面擁抱沒有更新了多年,並實現哈斯克爾98

N + K模式不被喜歡,因爲有可能存在的數字,其匹配,例如n+1但沒有n,將適合該n+1

請考慮浮點數:存在一批適合其n+1(4294967296 ::浮子爲4294967295的N + 1,但這個數字不能被安裝到一個浮點 - 比較round (4294967296 :: Float)round (4294967295 :: Float),既產生4294967296) 。

你也可能有反彈+(haskell支持運算符重載),那麼模式匹配意味着什麼?爲了避免這種歧義,n + k模式被禁止。

如果你想使用N + K模式不管怎麼說,你可以在你的源文件的頂部使用語言編譯:

{-# LANGUAGE NPlusKPatterns #-} 

PS:我相信這一切在this email thread開始。