9

このようなパターン:

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であるかどうか、そしてなぜこれらのコンパイラーは異なった振る舞いをするのですか?

4

2 に答える 2

16

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

詳しくはこちらをご覧ください。

于 2012-09-13T20:03:03.387 に答える
9

haskell 98 では合法ですが、haskell 2010 では禁止されており、GHC の最近のバージョンではこれが実装されています。一方、Hugs は何年も更新されておらず、haskell 98 を実装しています。

n+k パターンは、たとえば一致する数字が存在する可能性がありますが、それに適合するものn+1がないため、好ましくありません。nn+1

浮動小数点数を検討してください: 適合する数値が存在しますn+1(4294967296 :: Float は 4294967295 の n+1 ですが、この数値を Float に適合させることはできません -- と を比較するround (4294967296 :: Float)round (4294967295 :: Float)、両方とも 4294967296 が得られます)。

また、リバウンドしている可能性があります+(haskell は演算子のオーバーロードをサポートしています)。パターン マッチはどういう意味ですか? このようなあいまいさを避けるために、n+k パターンは許可されませんでした。

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

{-# LANGUAGE NPlusKPatterns #-}

PS: すべてはこのメール スレッドから始まったと思います。

于 2012-09-14T02:25:57.877 に答える