18

Haskell コンパイラは、次の関数でエラーをスローします。

balancedMax :: Int -> Int -> Int
balancedMax -1 _ = -1
balancedMax _ -1 = -1
balancedMax a b = max a b

記号を反転すると問題が解決します。

balancedMax :: Int -> Int -> Int
balancedMax 1 _ = -1
balancedMax _ 1 = -1
balancedMax a b = max a b

ネガでパターン マッチングが失敗するのはなぜですか?また、クリーンな回避策は何ですか?

4

2 に答える 2

33

f -1 = ...として解析されるため、マイナス演算子を再定義しようとしていると考えられるため、失敗しますf - 1 = ...

これを修正するには、括弧を追加するだけです:

balancedMax :: Int -> Int -> Int
balancedMax (-1) _ = -1
balancedMax _ (-1) = -1
balancedMax a b = max a b

同じことが式でも起こります。負のリテラルで呼び出すbalancedMaxには、括弧も必要です。

于 2013-06-07T05:05:54.113 に答える
7

f -1 = ...として解析されるためf - 1 = ....

わからない場合は、次と同じことを意味します。

(-) f 1 = ....

これは、次のような関数の定義に似ています。

somefunc x 1 = x + 1

これはたまたま somefunc() を次のように定義するのと同じです:

x `somefunc` 1 = x + 1

(-) を使用する場合、中置位置、つまり 2 つの引数の間に配置する場合、バッククォートを記述する必要はありません 。

私が見た 2 つの初心者向けの Haskell の本では、早い段階で、単項 - は (-3) のように括弧で使用する必要があると警告されています。

于 2013-06-07T08:59:39.363 に答える