回答:
これは言語の設計上の決定でした。-1
は数値ですが、このコンテキストでの使用法は関数(-)
とは関係ありません。(Ackdariが回答で言及しているように、この使用法は関数に関連していますnegate
。)これをは、いくつかの妥協点があり。
(-)
オペレーターの正しい部分をとることはできません。回避策として、Haskellがsubtract
関数を提供します。
負の整数は、それが割り当ての先頭(例:=
またはの直後->
)でない限り、括弧なしで書き込むことはできません。これにより、解析エラーが発生します。
let x = 8 * -1
代わりに、次のように書く必要があります
let x = 8 * (-1)
ただし、これは問題ありません。
let x = -1 * 8
これらは、言語の設計者にとって妥当なトレードオフであると見なされていました。
答えはすでにhaskell-wikiに記述されています、それは述べています
単項マイナスは、プレリュード関数の構文糖です
negate
そのため、関数(-)
は常にa - b
関数でありlet x = -y
、コンパイラーのようなコードを記述した場合
、コンパイラはそれをに変換しlet x = negate y
ます。
単項マイナスはHaskellでは特別です。レポートのセクション3.4で述べたように:
特殊な形式は、Haskellでの唯一の前置演算子である前置否定を示し、の構文です。二項演算子は、プレリュードのの定義を必ずしも参照する必要はありません。モジュールシステムによってリバウンドされる可能性があります。ただし、単項は常にプレリュードで定義された関数を参照します。演算子のローカルな意味と単項否定の間にはリンクがありません。
-e
negate (e)
-
-
-
negate
-