回答:
これは言語の設計上の決定でした。-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での唯一の前置演算子である前置否定を示し、の構文です。二項演算子は、プレリュードのの定義を必ずしも参照する必要はありません。モジュールシステムによってリバウンドされる可能性があります。ただし、単項は常にプレリュードで定義された関数を参照します。演算子のローカルな意味と単項否定の間にはリンクがありません。
-enegate (e)---negate-