OCaml接受函数的函数

时间:2015-10-24 17:21:12

标签: ocaml

我需要在OCaml中编写一个pipe函数,以便pipe [f1;...;fn](其中f1,...,fn是函数!)返回一个函数{{1对于任何x,f计算f x

我需要使用fn(...(f2(f1 x)))来编写它,并且需要填写函数的参数

List.fold_left

我已经填写了基地。如果管道的第一个参数是空列表,则返回第二个参数。例如:管道[] 3 = 3。 我知道我想要执行累加函数a的函数x。 我不知道怎么写。我写了让f a x = x a但是在我测试时给了我一个错误 pipe [(fun x - > x + x); (有趣的x - > x + 3)] 3

它应该在3上运行x + x然后在结果上运行x + 3并给我9但是当我尝试使用let f a x = x时它给了它一个类型错误 填写部分

let pipe fs =
   let f a x = "fill in this part" in
   let base = fun x ->x in
   List.fold_left f base fs;;

创建一个接收2个函数并相互运行的函数的正确格式是什么。例如:创建一个函数,它接受函数a和b,并在a的结果上运行b。

3 个答案:

答案 0 :(得分:1)

评估(fold_left g init fs) x

  • fs为空时,(fold_left g init fs) x = init x。在您的情况下,您希望它是x
  • fs = fs' @ [fn]时:根据您希望的真实情况,表达式应该评估为 fn (fold_left g init fs' x)但使用fold_left的定义,它也会评估(g (fold_left g init fs') fn) x

因此,如果以下等式成立:

  • init x = x

  • (g k f) x = f (k x)

问题解决了。因此,让我们定义init = fun x -> xg k f = fun x -> f (k x)

答案 1 :(得分:0)

好吧,base是一个像fun x -> ...这样的函数。

同样,你的函数f需要返回一个函数,所以假设它返回的内容如下:

fun z -> ...

你必须弄清楚这个函数应该用它的参数z做什么。

答案 2 :(得分:0)

想出来只需要那里的z为a和x来调用