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

Loops 在循环中运行多个函数的标准ML(使用递归或任何其他方法),loops,recursion,sml,smlnj,ml,Loops,Recursion,Sml,Smlnj,Ml,我定义了三个不同的函数,它们将执行计算并返回一个值。这些函数将始终重新定义变量,直到达到特定条件。我在让它们在“循环”场景中运行时遇到问题。我知道函数式语言不是执行循环的最佳语言,你应该使用递归……但我很难理解如何执行循环 我将制作一些真正简单的任意函数来解释我的情况 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

我定义了三个不同的函数,它们将执行计算并返回一个值。这些函数将始终重新定义变量,直到达到特定条件。我在让它们在“循环”场景中运行时遇到问题。我知道函数式语言不是执行循环的最佳语言,你应该使用递归……但我很难理解如何执行循环

我将制作一些真正简单的任意函数来解释我的情况

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);
fun whileloop(x,a)=

如果(a我的答案中给出了一个函数,它简单地对另一个函数进行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
val n = repeatWhile (fn x => x > 0) (fn x => x - 1) 20
结果是20

或者,您可能希望根据条件而不是计数重复:

fun repeatWhile p f x = if p x then repeatWhile p f (f x) else x
比如说,

val n = repeat 20 (fn => n + 1) 0
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
然后:


我已经在中向您展示了一个解决方案--我在回答中给出的函数
iter
与您描述的完全一样(但是,我想知道您描述的是否是您真正想要的)我回家后会更深入地研究这个问题,但最终我会尝试运行三个不同的方程1000次,并返回每个方程的值。问题是……第二个方程使用第一个方程的值,第三个方程使用第二个方程的值。我也支持你的说法,即我描述它的方式是我错了。我现在就这样做,就像C++一样,所以我可能错误地处理整个程序。我希望我以前的评论能更好地解释我的情况。非常感谢你帮助我解决所有这些问题。我真的很感激。我还有一个问题,我跟这个例子相似,但要求ADDI。假设语句。