4

f関数を x に 2 回適用するこの関数を作成しようとしています。

Prelude> applyTwice :: (a -> a) -> a -> a
Prelude> let applyTwice f x = f (f x)

さて、以下の式を評価しようとすると

Prelude> applyTwice (`subtract` 3) 10
Output: 10

Prelude> applyTwice (3 `subtract`) 10
Output: 4

私の理解によると、subtractは中置関数であるため、指定されたパラメーターは空の位置 (左または右のオペランド) を埋める必要があるため、最初の式は次のapplyTwice (`subtract` 3) 10ように動作する必要があります

10 `subtract` 3 `subtract` 3

したがって、この場合の結果は になるはずです4が、出力は10

他の場合、つまりapplyTwice (3 `subtract`) 10、出力は4、私が期待している場所です10

私はどこか間違っていますか?

4

1 に答える 1

6

演算子セクションの表記についてのあなたの理解applyTwiceは正しいです。しかし、あなたはおそらく何が何をするのか混乱してsubtractいます。次のようなライブラリのドキュメントを参照してください。

と同じflip (-)

似ていsubtractます(-)が、引数が反転しています。したがって、

  applyTwice (`subtract` 3) 10
=
  (`subtract` 3) ((`subtract` 3) 10)
=
  (`subtract` 3) (10 `subtract` 3)
=
  ((10 `subtract` 3) `subtract` 3)
=
  (3 - 10) `subtract` 3
=
  (-7) `subtract` 3
=
  3 - (-7)
=
  10

他の式についても同様です。

于 2013-04-15T10:06:14.063 に答える