【发布时间】:2021-07-11 08:22:20
【问题描述】:
有很多基于applyTwice 的问题,但没有一个与我的问题有关。我了解applyTwice 函数是这样定义的:
applyTwice :: (a -> a) -> a -> a
applyTwice f a = f (f a)
两次应用一个函数。所以如果我有一个增量函数:
increment x = x + 1
然后做
applyTwice increment 0
我得到 2。但我不明白这些结果:
applyTwice applyTwice applyTwice increment 0 -- gives 16
applyTwice applyTwice applyTwice applyTwice increment 0 -- gives 65536
applyTwice applyTwice applyTwice applyTwice applyTwice increment 0 -- stack overflow
我也知道
twice = applyTwice applyTwice increment
applyTwice twice 0 -- gives 8
我根本无法理解这些结果,如果有人可以解释,我会很高兴。如果这是基本的东西,我很抱歉,因为我刚刚学习 Haskell。
【问题讨论】:
-
你需要了解函数应用是左关联的,所以
applyTwice applyTwice increment和(applyTwice applyTwice) increment是一样的。所以为了了解(applyTwice applyTwice) increment做了什么,你需要了解(applyTwice applyTwice)一般做了什么,然后弄清楚它对increment做了什么。 -
如果您将
applyTwice applyTwice视为2^2,那么applyTwice . applyTwice就是2*2,因此给出相同的结果:) 查看Church encoding。与求幂applyTwice @(Int->Int) $ applyTwice @Int不同,类型不会爆炸applyTwice @Int . applyTwice @Int
标签: haskell functional-programming higher-order-functions currying