Function ocaml中的多功能和提取列表

Function ocaml中的多功能和提取列表,function,ocaml,Function,Ocaml,关于多个函数,我希望得到类似fffx的结果 这是我的密码 let rec multifun (f:'a -> 'a) (n:int) = match n with |1 -> fun (x:'a) -> f x |_ -> multifun(fun (x:'a) -> f(f x)) (n-1);; 但是结果multifun fn x=>x*x 3 2返回65536而不是256, 我知道原因,但我不知道如何编辑它,实际上我应该启动一个函数g并对其进行更改,而不是保

关于多个函数,我希望得到类似fffx的结果 这是我的密码

let rec multifun (f:'a -> 'a) (n:int) = match n with
|1 -> fun (x:'a) -> f x
|_ -> multifun(fun (x:'a) -> f(f x)) (n-1);;
但是结果multifun fn x=>x*x 3 2返回65536而不是256, 我知道原因,但我不知道如何编辑它,实际上我应该启动一个函数g并对其进行更改,而不是保留对f本身的更改,但我不知道如何在这段代码中进行更改

另一个是关于实现这个函数的:ltake[3;7;5;1;2]3返回[3;7;5]

我的代码是

let rec ltake l n = match (l,n) with
|([],n) -> []
|(hd::tl,0) -> []
|(hd::tl,n) -> hd::(ltake tl n-1);;
但是编译器说这个表达式的类型是'a list' 但表达式应为int类型
还是不知道为什么。希望有人能帮助我

如果我正确理解了您的需求,那么您正在尝试实现功能


对于第二个问题,您已经忘记了n-1附近的parens。

正如ivg所说,您的第二个问题是在最后一行中缺少n-1附近的parens

对于第一个问题,它确实来自这样一个事实:每个递归调用都将嵌套f的数量加倍,而不是增加一个

您需要在多行函数中添加f:

let rec multifun (f:'a -> 'a) (n:int) = match n with
| 0 -> fun x -> x (* I added the 0 case as it can be quite usefull *)
| _ -> f (multifun f) (n-1);;
您还可以尝试在获得x后更简单地编写多功能:

let rec multifun f n x =
  if n = 0
  then x
  else multifun f (n-1) (f x);;
这同样有效,而且可能更高效,完全允许您键入let g=multifun f 10

请注意,良好的实践要求您在某个地方添加断言n>=0,因为这正是您真正想要的断言:-p