我定义了三个不同的函数来执行计算并返回一个值。这些函数将一直重新定义变量,直到达到特定条件。我遇到了让这些问题在"循环中运行的问题。场景。我知道函数式语言不是最好的执行循环,你应该使用递归...但我很难绕过如何执行此操作。
我将制作一些简单的任意函数来解释我的情况。
fun add_them (a,b) =
a+b;
fun substract_them (c,d) =
c-d;
fun add_them2 (e,f) =
e-f;
val a = 5;
val b = 7;
val c = 10;
val d = 1;
val a = add_them (a,b);
val d = add_them2 (c,d);
所以,让我们说我要跑最后两行1000次。所以Val A和Val D将继续增加到一个庞大的数字。现在我可以将这两行复制并粘贴1000次并得到我想要的结果..但这当然会失去编程的目的:))
我试图创建一个循环,我可以抛出这两个函数。我想出了类似下面的东西,但我不知道如何合并这两个。也许我完全倒退了。
fun whileloop (x,a) =
if (a<1)
then x
else whileloop(x+1,a-1);
所以我的目标是使用递归将上面的val a和val d表达式插入到另一个函数中并运行它一定次数。任何帮助将不胜感激。
答案 0 :(得分:2)
在我的回答here中给出了一个简单地迭代另一个函数n次的函数。但听起来你想要将一个给定的函数n次应用于种子,如下所示:
f (f (f (f ... (f x) ... )))
可以通过以下功能完成:
fun repeat n f x = if n = 0 then x else repeat (n-1) f (f x)
例如,
val n = repeat 20 (fn => n + 1) 0
结果是20。
或许您想根据条件而不是计数重复:
fun repeatWhile p f x = if p x then repeatWhile p f (f x) else x
例如,
val n = repeatWhile (fn x => x > 0) (fn x => x - 1) 20
返回0.
这两个函数都是多态的,因此也可以使用元组。例如:
val (x, y) = repeatWhile (fn (a, b) => a > 0) (fn (a, b) => (a-1, b+1)) (20, 0)
返回(0,20)。
如果你不喜欢为条件和“动作”使用两个单独的函数参数,你也可以通过让它们返回一对来组合它们:
fun repeatWhile2 f x =
let val (c, y) = f x in if c then repeatWhile2 f y else x end
然后:
repeatWhile (fn (a, b) => (a > 0, (a-1, b+2))) (20, 0)