6

GHCiの場合:

  1. プレリュード>(+3)2
    5
  2. プレリュード>(* 3)2
    6
  3. プレリュード>(/ 3)2
    0.6666666666666666
  4. プレリュード>( -3)2 文字通りのit'から生じる
    (Num(t-> t1))のインスタンスはありません:it =(-3)2
    3' at <interactive>:1:2
    Possible fix: add an instance declaration for (Num (t -> t1))
    In the expression: 3
    In the expression: (- 3) 2
    In the definition of

最後のものを修正して-1を返すようにするにはどうすればよいですか?

4

4 に答える 4

14

Haskell の文法では、そのように使用することはできません-subtract代わりに次の関数を使用してください。

(subtract 3) 2
于 2010-08-04T14:11:35.247 に答える
9

grddev's answer の脚注として、 Haskell 98 Reportの関連する段落を次に示します。

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

これは、私が最初に遭遇したときに私をイライラさせたものです: と基本的に同じように見える:info (+)のに、なぜこのコンテキストでオペレーターがこれほど異なった振る舞いをするのか理解できませんでした。:info (-)

subtractgrddev が示唆するように を使用するか、単に新しい中置演算子を定義することができます。

Prelude> let (#) = (-)
Prelude> (# 3) 2
-1

subtractあなたのコードを読む可能性のある他の人になじみがあるという利点があります。

于 2010-08-04T14:47:04.343 に答える
3

できるよ

(-) 3 2

しかし、それはあなたに1を与えます.-1を得るには、3を-の2番目の引数にバインドする必要があります。

flip (-) 3 2
于 2010-08-04T14:22:50.957 に答える
1

元の形状を維持したい場合は、いつでもマイナスを追加できます。

(+ -3)

きれいではありませんが、パターンにもう少し適合します。

于 2010-08-05T00:29:27.483 に答える