OCaml类型推断实例:组合函数let o f g x的类型推导咨询
OCaml函数组合子
o的类型推断过程说明 你当前的理解是反过来的:类型签名中
('a -> 'b)对应的是参数f的类型,('c -> 'a)对应的是参数g的类型。
首先给出示例中的代码:
let o f g x = (f (g (x)));; val o : ('a -> 'b) -> ('c -> 'a) -> 'c -> 'b = <fun>
完整类型推断步骤
我们从函数定义的结构出发,从内到外推导每个部分的类型:
- 第一步:给最内层的参数
x分配泛型类型'c,即x : 'c - 第二步:
g以x为输入,说明g是参数类型为'c的函数,我们暂将g的返回值类型定为'a,因此可得g : 'c -> 'a - 第三步:
f以g的返回值为输入,说明f的参数类型为'a,我们暂将f的返回值类型定为'b,因此可得f : 'a -> 'b - 第四步:整个函数
o f g x的返回值就是f的返回值,类型为'b
把三个参数的类型和返回值类型按顺序拼起来,就得到了o的完整类型:('a -> 'b) -> ('c -> 'a) -> 'c -> 'b
相关疑问解答
'c对应的就是最内层参数x的类型,也就是你传入的待处理初始值的类型。
示例验证
我们可以用实际调用验证类型匹配:
(* g 对应 'c -> 'a,这里'c是string,'a是int *) let g s = String.length s;; (* f 对应 'a -> 'b,这里'a是int,'b是int *) let f n = n * 2;; (* 调用o f g "test",x是"test"对应类型'c = string,返回结果是8 *) o f g "test";; - : int = 8
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

