我正在尝试编写此函数,该函数在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
我在某个地方出错了吗?
答案 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
类似于另一个表达。