求OCaml中类型为('a -> 'a -> 'a) -> ('a * 'a -> 'a)的表达式写法
OCaml类型匹配问题解答
你编写的代码本身已经完全符合题目要求的类型规范。OCaml 遵循函数类型箭头右结合的规则,因此你得到的类型签名 ('a -> 'a -> 'a) -> 'a * 'a -> 'a 和题目要求的 ('a -> 'a -> 'a) -> ('a * 'a -> 'a) 是完全等价的,只是类型打印时默认省略了右侧的括号。
如果需要得到和题目要求字面完全一致的类型显示,可以调整写法,显式返回一个接收二元组的匿名函数,最简实现如下:
let expr f = fun (x, y) -> f x y
在OCaml顶层环境执行后,会输出匹配度完全一致的类型校验结果:
val expr : ('a -> 'a -> 'a) -> ('a * 'a -> 'a) = <fun>
如果需要保留你原有代码的逻辑(判断f x y与x相等后返回对应值),也可以调整为显式返回函数的写法,类型同样符合要求:
let expr f = fun (x, y) -> if f x y = x then x else y
这类实现的本质是完成柯里化函数到非柯里化函数的转换:将接收两个独立参数的函数f,包装为接收单个二元组作为参数的函数。
内容的提问来源于stack exchange,提问作者Arthur Chiron
相关产品推荐
相关产品推荐

