函数对的组成

问题描述 投票:0回答:2

我对 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)
functional-programming ocaml
2个回答
1
投票

您正在编写一个需要一对的函数:

fun pair -> ...

并返回一个函数,该函数接受一些值:

fun pair -> (fun value -> ...)

内部函数的返回值是pair中存储的函数的组合。


1
投票

您的函数(如下引用)似乎运行得很好。

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
© www.soinside.com 2019 - 2024. All rights reserved.