OCaml函数对组合实现求助:如何完成compose_pair函数?
OCaml 实现compose_pair函数:组合元组中的两个函数
你的最后一次尝试是正确的!我们来拆解逻辑和之前的问题:
首先明确需求:compose_pair要接收一个元组,里面是两个可组合的函数(第一个函数的输入类型是第二个函数的输出类型),最终返回一个新函数,能把输入依次经过这两个函数处理。
你最初写的(fst p) (snd p)存在类型不匹配问题:snd p是'a -> 'b类型的函数,而fst p需要的参数是'b类型的值,不是函数,因此这行代码无法通过编译。
而正确的实现:
let compose_pair (p:(('b -> 'c) * ('a -> 'b))) : 'a -> 'c = fun x -> fst p (snd p x)
逻辑如下:
- 定义一个匿名函数,接收
'a类型的参数x - 先调用
snd p x,把x传给元组里的第二个函数,得到'b类型的结果 - 再把这个结果传给元组里的第一个函数
fst p,最终返回'c类型的值 - 整个匿名函数的类型就是
'a -> 'c,完全符合函数的返回类型要求
另外,你也可以用模式匹配简化代码,让逻辑更直观:
let compose_pair ((f, g) : ('b -> 'c) * ('a -> 'b)) : 'a -> 'c = fun x -> f (g x)
这里直接把元组中的两个函数分别绑定到f和g上,代码可读性更强,功能和你之前的正确实现完全一致。
内容的提问来源于stack exchange,提问作者pepsilon
相关产品推荐
相关产品推荐

