You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 16:27:03