关于多个函数,我想得到像f(f(f(x))的结果 这是我的代码
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);;
但是编译器说“这个表达式有'类型'列表 但是期望类型为int的表达式“ 还是不知道为什么。希望有人能帮助我
答案 0 :(得分:0)
如果我正确理解您的要求,那么您正在尝试实施apply_n_times功能。
对于第二个问题,你已经忘记了n-1
周围的问题。
答案 1 :(得分:0)
就像ivg所说的那样,你的第二个问题是关于你最后一行n-1
周围的问题。
对于你的第一个问题,确实是因为每次递归调用都会使嵌套f
的数量翻倍,而不是添加一个。
您需要在multiline
函数中添加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
。
请注意,良好做法会要求您在某处添加assert (n>=0)
(因为这是您真正想要的那种断言:-p)。