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

时间:2017-06-04 20:50:16

标签: 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 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表达式插入到另一个函数中并运行它一定次数。任何帮助将不胜感激。

1 个答案:

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