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)
。