OCaml中仅定义参数n的aux函数为何可接收list参数?
OCaml列表长度代码参数问题解答
核心原因是OCaml中function关键字自带语法糖特性,它会自动为函数追加一个用于模式匹配的隐式参数,不需要显式写在参数声明列表里。
代码等价转换
你看到的aux定义:
let rec aux n = function | [] -> n | _ :: t -> aux (n + 1) t
和下面显式声明两个参数、手动编写match匹配的写法执行逻辑完全一致:
let rec aux n lst = match lst with | [] -> n | _ :: t -> aux (n + 1) t
调用逻辑说明
aux本质是柯里化的双参数函数:第一个参数是int类型的计数值n,第二个就是function隐式声明的列表参数,类型为'a list,函数整体类型为int -> 'a list -> int。- 末尾调用
aux 0 list时,0是传给第一个参数n的初始计数值,list就是传给function隐式参数的待处理列表,参数数量和类型完全匹配,不存在多传参数的问题。 - 递归分支里的
aux (n + 1) t也是同样逻辑:更新后的计数值n+1作为第一个入参,剩余列表t作为第二个隐式入参,完全符合函数调用规则。
从REPL输出的最终类型签名
val length : 'a list -> int = <fun>也能反推逻辑:aux 0本身就是一个接收'a list返回int的函数,自然可以接收外层传入的list参数计算得到最终长度结果。
内容的提问来源于stack exchange,提问作者Jam
相关产品推荐
相关产品推荐

