Haskell高阶函数中“减法”的行为

时间:2013-04-15 09:52:29

标签: haskell

我正在尝试编写此函数,该函数在x

上应用函数f两次
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

我在某个地方出错了吗?

1 个答案:

答案 0 :(得分:6)

您对applyTwice和操作符部分表示法的理解是正确的。但是,您可能会对subtract所做的事情感到困惑。请参阅the library documentation,其中包含:

  

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

类似于另一个表达。