Scheme中(map (p q) (list 1 2 3))运行输出与预期不符疑问
代码逻辑解析
首先拆解两个函数的定义:
(define p (lambda (x) (lambda (y) (x (x y))))):p是高阶函数,接收函数参数x后,返回一个新的匿名函数。这个匿名函数接收参数y时,会连续两次调用x,执行逻辑等价于x(x(y))。(define q (lambda (x) (* x x))):q是基础的平方计算函数,输入数值返回它的平方值。
为什么输出是(1 16 81)?
(p q)就是把q作为参数传入p,得到的新函数逻辑为:对输入值连续执行两次q运算,也就是平方后再平方,等价于计算输入值的四次方:
运算推导:
q(y) = y²,q(q(y)) = (y²)² = y⁴
map (p q) (list 1 2 3) 就是对列表中的每个元素分别计算四次方:
- 1的四次方 = 1
- 2的四次方 = 16
- 3的四次方 = 81
你预期的(1 4 9)是直接调用(map q (list 1 2 3))的结果,也就是仅对每个元素做一次平方运算的输出,和(p q)的两次平方叠加逻辑不同。
内容的提问来源于stack exchange,提问作者user23232512
相关产品推荐
相关产品推荐

