OCaml中类型签名f: 'a -> 'b -> c' -> d'的含义是什么?如何调用?
核心结论
- 从柯里化的底层实现逻辑看:f本质是单参数函数,每次接收一个参数后返回一个新的函数,直到收齐3个参数后才会生成最终结果
- 从日常使用的语法糖角度看:你可以直接把它当成接收3个参数、最终返回1个
'd类型值的函数使用,两种理解都没有问题
调用方式
这类写法是支持柯里化的静态函数式语言(Haskell/OCaml/F#/Standard ML等)的标准类型签名,常见调用方式有两种:
1. 全参数调用直接获取结果
按顺序传入3个对应类型的参数即可,不同语言的语法细节略有差异,核心逻辑一致,示例(Haskell语法):
-- 假设f是三个整数相加的函数,对应类型为Int -> Int -> Int -> Int f 1 2 3 -- 直接得到返回值6
2. 部分应用生成偏函数
你可以选择只传入前N个参数(N<3),得到一个接收剩余参数的新函数,后续可以随时调用这个新函数传入剩余参数:
-- 只传前两个参数,得到新函数add12,类型为Int -> Int let add12 = f 1 2 -- 后续调用add12传入剩下的第三个参数即可得到结果 add12 5 -- 返回8 add12 10 -- 返回13
补充说明
你给出的类型签名存在笔误,类型变量的标注引号需要放在变量名前,正确写法是f: 'a -> 'b -> 'c -> 'd。
内容的提问来源于stack exchange,提问作者Shisui
相关产品推荐
相关产品推荐

