如果我不这样做,我将如何在OCaml中应用n次函数 知道函数参数吗?
我希望将呼叫
iter(n, fun x -> 2+x) 0
评估为2*n
这与2+2+2+2...
相同。此外,如果n=0
它应该 返回身份功能。
我的尝试:
let rec iter : int * (int -> int) -> (int -> int)
= fun (n,f) ->
if n = 0 then f
else iter((n-1), f( f () ))
可能重复:OCaml recursive function to apply a function n times但是这个问题有一个匿名函数的参数,所以答案对我没有帮助。
答案 0 :(得分:1)
我不确定这是不是你想要的东西 - 对你所联系的答案的一个小修改似乎可以做到这一点:
*编辑:身份功能取决于你传递给它的功能的性质(对吧?),所以我不确定如何通过查看f来获得它。这就是我现在只回归f的原因。并重复fun x -> x + 2
n次 - 这不会给你x + 2 * n
吗?
let iter n f =
let chain_func f1 f2 arg = f1 (f2 arg) in
let rec aux n f newf =
if n <= 0 then newf else aux (n - 1) f ( chain_func f newf ) in
aux (n - 1) f f;;
*编辑2:身份功能为fun x -> x
,因此最后一行需要修复为:aux n f (fun x -> x)
答案 1 :(得分:1)
你现在可能没有“有一个参数”,但由于结果是一个函数,你总是可以通过返回一个lambda来在范围内引入一个参数:
iter (n, fun x -> x+1) 0 ≡ n
请注意,正如Willem评论的那样,你的基本情况可能是错误的:对于n+1
,你想要返回身份函数而不管传递了什么函数。否则你会变得奇怪行为,例如这样的函数通常应该满足let rec iter : int -> ('a -> 'a) -> ('a -> 'a)
= fun n f x -> if n = 0
then x
else iter (n-1) f (f x);;
,但在你的基本情况下,它会提供x
。
我会写这个函数:
n
这里我没有明确提到身份功能,但因为我只是在let rec iter : int -> ('a -> 'a) -> 'a -> 'a
= fun n f ->
if n = 0
then fun x -> x (* identity function *)
else fun x -> iter (n-1) f (f x);;
为零时返回function yourthemename_preprocess_page(&$variables) {
$node = \Drupal::routeMatch()->getParameter('node');
if ($node) {
$variables['title'] = $node->getTitle();
}
}
,这就是身份功能所做的事情。或者,您可以返回另一个只传递参数的lambda:
{{title}}