2012-09-13 10 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年以降のリリースを持っていない、と 'NPlusKPatterns'はHaskell2010標準で除去しました。 –

答えて

16

これは、n+kパターンとして知られています。一般的にdislikedであり、Haskell2010仕様から削除されました.GHCは最新の仕様に更新されていないHugsとは異なり、デフォルトでGHCを有効にしなくなりました。それは-XNPlusKPatternsフラグが有効になっているGHCIでコンパイルする必要があります。

詳細はthisを参照してください。

9

haskell 98ではこれは合法ですが、haskell 2010では禁止されています。これはGHCの最新バージョンが実装しているものです。一方、抱擁は年間更新され、例えばn+1ためにどの一致番号が存在し得るが、そのn+1に適合する何らnがないので嫌われるハスケル98

N + kのパターンを実装されませんでした。

は、浮動小数点数を考慮してください(4294967296 ::フロートは、4294967295のために、N + 1であるが、この数は、フロートに取り付けることができない - 、両方の収率4294967296をround (4294967296 :: Float)round (4294967295 :: Float)を比較)n+1にフィット数が存在します。

また、あなたがリバウンド+を有することができる(Haskellは演算子のオーバーロードをサポートしている)ので、パターンマッチは何を意味するのでしょうか?このようなあいまいさを避けるために、n + kパターンは使用できませんでした。

あなたはとにかく使いたいのn + k個のパターンの場合は、ソースファイルの先頭に言語プラグマを使用することができます。

{-# LANGUAGE NPlusKPatterns #-} 

PS:私はそれがすべてthis email threadに始まったと考えています。

関連する問題