4

我正在尝试编写此函数,该函数f在 x 上两次应用该函数

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 回答