首页 文章

OCaml接受函数的函数

提问于
浏览
1

我需要在OCaml中编写一个 pipe 函数,使得 pipe [f1;...;fn] (其中 f1 ,..., fn 是函数!)返回一个函数 f ,这样对于任何x, f x 计算 fn(...(f2(f1 x))) .

我需要使用 List.fold_left 编写它并需要填写函数的参数

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

我已经填写了基地 . 如果管道的第一个参数是空列表,则返回第二个参数 . 例如:pipe [] 3 = 3.我知道let f a x part我想执行累积函数a的函数x . 我只是不确定如何写 . 我写了让f a x = x a但是当我测试管道时给了我一个错误[(fun x - > x x); (有趣的x - > x 3)] 3

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

# let _ = pipe [(fun x -> x+x); (fun x -> x + 3)] 3;;
File "", line 1, characters 24-25:

Error: This expression has type 'a -> 'a
       but an expression was expected of type int

创建一个函数的正确格式是什么,该函数接收2个函数并在彼此之间运行它们 . 例如:创建一个函数,它接受函数a和b,并在a的结果上运行b .

3 回答

  • 1

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

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

    fun z -> ...
    

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

  • 0

    要评估 (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) .

  • 0

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

相关问题