标准 ML 运行 循环中的多个函数(使用递归或任何其他方式)

Standard ML running multiple functions in a loop (Using recursion or any other means)

我已经定义了三个不同的函数来执行计算和 return 一个值。这些函数将始终重新定义变量,直到达到特定条件。我在 "loop" 场景中将这些设置为 运行 时遇到问题。我知道函数式语言不是执行循环的最佳选择,您应该使用递归...但我很难思考如何执行此循环。

我会做一些真正简单的任意函数来说明我的情况。

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 表达式上面的那些插入到另一个函数中,并且 运行 它一定次数。任何帮助将不胜感激。

我的答案中给出了一个简单地迭代另一个函数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

returns 0.

这两个函数都是多态的,因此也适用于元组。例如:

val (x, y) = repeatWhile (fn (a, b) => a > 0) (fn (a, b) => (a-1, b+1)) (20, 0)

returns (0, 20).

如果您不喜欢对条件和 "action" 使用两个单独的函数参数,您也可以将它们组合起来 return 一对:

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)