pipe的ocaml实现

pipe的ocaml实现,ocaml,Ocaml,我正在尝试实现类似于管道的功能 输入:函数列表 输出:一个函数 示例: # pipe [(fun y -> y+5);(fun y -> y*3)] 1 = 18 # pipe [(fun z -> z*3);(fun z -> z+5)] 1 = 8 我的问题: # pipe [(fun y -> y+5);(fun y -> y*3)] 1 = 18 # pipe [(fun z -> z*3);(fun z -> z+5)] 1 = 8

我正在尝试实现类似于
管道的功能

输入:函数列表

输出:一个函数

示例:

# pipe [(fun y -> y+5);(fun y -> y*3)] 1 = 18
# pipe [(fun z -> z*3);(fun z -> z+5)] 1 = 8
我的问题:

# pipe [(fun y -> y+5);(fun y -> y*3)] 1 = 18
# pipe [(fun z -> z*3);(fun z -> z+5)] 1 = 8
辅助函数
composite
接受两个参数,即函数
f
和函数
l
列表。如果列表为空,则返回函数
f
。 如果不是,则
f
将是列表头
g
的一个参数。 但是,我得到了一个语法错误。我不知道发生了什么事。 有人发现错误了吗

let pipe l =
  let composite f l = match l with
      []->f
    | g::gs -> (fun h -> (g -> f)) in
  List.fold_left composite (fun x -> x) l
(fun h->(g->f))
在语法上是不正确的,我不确定它应该是什么意思

您的
复合
函数的模式匹配看起来像是为递归函数编写的,但是您试图非递归地定义它,以便与
fold_left
一起使用。任何一种方法都是好的,但你需要下定决心,因为在这里你有一个可悲的妥协,但它不起作用。

(fun h->(g->f))
在语法上是不正确的,我不确定它应该是什么意思


您的
复合
函数的模式匹配看起来像是为递归函数编写的,但是您试图非递归地定义它,以便与
fold_left
一起使用。无论哪种方式都是好的,但你需要下定决心,因为这里有一个可悲的妥协是行不通的。

谢谢你的回复。如您所见,“g”是列表的第一个元素,它是一个函数。对于第二个模式匹配,如果“l”是一个至少有一个元素的列表,我想得到一个函数“g(f(x))”。我如何表达这个想法?如果
f
g
'a->'a
类型的值,那么函数“g(f(x))”就是
fun x->g(f x)
。谢谢你的回复。如您所见,“g”是列表的第一个元素,它是一个函数。对于第二个模式匹配,如果“l”是一个至少有一个元素的列表,我想得到一个函数“g(f(x))”。如果
f
g
'a->'a
类型的值,那么函数“g(f(x))”就是
funx->g(fx)