(-)どうやら2つの異なるタイプを持つことができますか?


12

ghciで、タイプすると

:t (-)

のタイプを把握する (-)

(-) :: Num a => a -> a -> a

私が書くときしかし、-1Haskellのリターンをそれを意味すると思わ数は、(-)型ですNum a => a -> a(-)一見どうすれば2つの異なるタイプを持つことができますか?

回答:


15

これは言語の設計上の決定でした。-1は数値ですが、このコンテキストでの使用法は関数(-)は関係ありません。(Ackdariが回答で言及しているように、この使用法は関数に関連していますnegate。)これをは、いくつかの妥協点があり。

  1. (-)オペレーターの正しい部分をとることはできません。回避策として、Haskellがsubtract関数を提供します。

  2. 負の整数は、それが割り当ての先頭(例:=またはの直後->)でない限り、括弧なしで書き込むことはできません。これにより、解析エラーが発生します。

    let x = 8 * -1

    代わりに、次のように書く必要があります

    let x = 8 * (-1)

    ただし、これは問題ありません。

    let x = -1 * 8

これらは、言語の設計者にとって妥当なトレードオフであると見なされていました。


8

答えはすでにhaskell-wiki記述されています、それは述べています

単項マイナスは、プレリュード関数の構文糖です negate

そのため、関数(-)は常にa - b関数でありlet x = -y、コンパイラーのようなコードを記述した場合 、コンパイラはそれをに変換しlet x = negate yます。


7

単項マイナスはHaskellでは特別です。レポートのセクション3.4で述べたように

特殊な形式は、Haskellでの唯一の前置演算子である前置否定を示し、の構文です。二項演算子は、プレリュードのの定義を必ずしも参照する必要はありません。モジュールシステムによってリバウンドされる可能性があります。ただし、単項は常にプレリュードで定義された関数を参照します。演算子のローカルな意味と単項否定の間にはリンクがありません。-enegate (e)---negate-


2
SOでは、1文の回答や、内容が要約されていないリンクは破損する可能性があるため、推奨されません。
アンドリューレイ

レポート/標準へのリンクもwikis / tutorials / youtubeビデオと比較して大幅に悲観化されていると思いますか?
bipll

@bipllはい。リンクのみの回答の問題は、リンクターゲットの品質ではなく、リンクが破損するリスクです。レポートの関連セクションにコピーした場合、あなたの答えは結構です。
ジョセフSible-Reinstateモニカ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.