我对 OCaml 很陌生,目前正在尝试解决一些练习。在这样做的过程中,我偶然发现了以下问题:
let compose_pair (p:(('b -> 'c) * ('a -> 'b))) : 'a -> 'c =
目标是完成该函数,使其按顺序组成该对的两个函数。
我的问题是,据我了解,这个函数的返回类型应该再次是一个函数,但我真的不知道如何实现这一点。
我的尝试会是这样的
(fst p) (snd p)
如果我理解正确的话,它恰好会返回
'c
类型的内容。
有谁知道如何解决这个问题吗?我将非常感谢一些提示或提示。
我目前的尝试是这样的:
let compose_pair (p:(('b -> 'c) * ('a -> 'b))) : 'a -> 'c =
fun x -> fst p (snd p x)
您正在编写一个需要一对的函数:
fun pair -> ...
并返回一个函数,该函数接受一些值:
fun pair -> (fun value -> ...)
内部函数的返回值是pair中存储的函数的组合。
您的函数(如下引用)似乎运行得很好。
let compose_pair (p:(('b -> 'c) * ('a -> 'b))) : 'a -> 'c = fun x -> fst p (snd p x)
# let compose_pair (p:(('b -> 'c) * ('a -> 'b))) : 'a -> 'c =
fun x -> fst p (snd p x) ;;
val compose_pair : ('b -> 'c) * ('a -> 'b) -> 'a -> 'c = <fun>
# let f = compose_pair ((fun x -> x + 1), (fun x -> x * 2));;
val f : int -> int = <fun>
# f 3;;
- : int = 7
不过,是可以清理的。您可以直接将元组参数模式匹配到函数,而不是调用
fst
和 snd
。
let compose_pair (f, g) = ...
然后您可以生成一个接受参数并将其应用于这些函数的函数。
let compose_pair (f, g) =
fun x -> f (g x)
但是我们可以进一步简化,因为
let f a b c = ...
与写作 let f = fun a -> fun b -> fun c -> ...
相同。
let compose_pair (f, g) x = f (g x)
或者作为替代方案,使用
|>
运算符,这允许将其读取为 x
传递给 g
并将结果传递给 f
。
let compose_pair (f, g) x = x |> g |> f