OCaml在没有参数的情况下应用匿名函数n次?

时间:2017-10-06 08:45:39

标签: recursion functional-programming ocaml

  

如果我不这样做,我将如何在OCaml中应用n次函数   知道函数参数吗?

     

n-times

     

我希望将呼叫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但是这个问题有一个匿名函数的参数,所以答案对我没有帮助。

2 个答案:

答案 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

Try it online!

请注意,正如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

Try it online!

这里我没有明确提到身份功能,但因为我只是在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}}