关于OCaml函数部分应用的疑问:secret 3 2 (-5)为何输出9?
OCaml函数柯里化与部分应用的执行逻辑解释
首先看原OCaml函数定义:
let secret x y = let secret' x y z = x + y - z in let z = if x mod 2 = 0 then y else x - y in secret' x z ;;
执行语句:
print_int (secret 3 2 (-5));;
核心原因:OCaml的函数柯里化特性
OCaml里所有多参数函数本质都是柯里化函数——即接受一个参数后,返回一个接受下一个参数的函数,直到所有参数都传入才会执行最终计算。
分步拆解执行过程
- OCaml的函数调用是左结合的,
secret 3 2 (-5)等价于(secret 3 2) (-5),先执行secret 3 2:- 内部定义的
secret'是一个需要3个参数的函数:x + y - z - 计算内部变量
z:3 mod 2 = 1,不满足等于0的条件,所以z = 3 - 2 = 1 - 此时
secret' x z即secret' 3 1,这不是一次完整的函数调用——因为secret'需要3个参数,这里只传入了前两个,所以返回的是一个等待第三个参数的函数
- 内部定义的
- 接下来把
(-5)传给这个等待参数的函数,也就是执行完整的secret' 3 1 (-5),计算:
最终输出结果9。3 + 1 - (-5) = 3 + 1 + 5 = 9
纠正你的推导误区
你误以为secret 3 2会直接执行secret' 3 1得到结果,但实际上secret' 3 1只是部分应用了前两个参数的函数,并没有完成完整调用。只有当第三个参数(-5)传入后,才会触发secret'的完整计算。
内容的提问来源于stack exchange,提问作者Wula Aether
相关产品推荐
相关产品推荐

