为何OCaml中lookup函数的参数数量与定义不匹配?
为什么OCaml的lookup函数定义仅一个参数却能传两个调用?
这是OCaml的柯里化(Currying)特性加上语法糖导致的结果,核心原因是OCaml里所有函数本质上都只接受单个参数,多参数调用其实是函数嵌套调用的简化写法。
拆解代码的真实结构
你看到的function是OCaml的语法糖,它等价于fun 参数 -> match 参数 with ...。把lookup的定义展开后,真实结构是这样的:
let rec lookup k = fun lst -> match lst with | [] -> None | (k', v) :: t -> if k = k' then Some v else lookup k t
很明显,lookup是一个只接受k作为参数的函数,它执行后会返回另一个接受列表参数的函数(就是那个fun lst -> ...部分)。
调用写法的本质
调用lookup k t的时候,OCaml会自动解析成(lookup k) t:
- 先执行
lookup k,得到那个专门处理键值对列表的函数; - 再把
t作为参数传给这个返回的函数,完成查找逻辑。
类型层面的验证
lookup的完整类型是'a -> ('a * 'b) list -> 'b option,这个类型的含义是:
- 接受一个
'a类型的键k; - 返回一个
('a * 'b) list -> 'b option类型的函数,这个函数才是真正处理列表、返回查找结果的部分。
内容的提问来源于stack exchange,提问作者smwikipedia
相关产品推荐
相关产品推荐

