标准 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)
我已经定义了三个不同的函数来执行计算和 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 表达式上面的那些插入到另一个函数中,并且 运行 它一定次数。任何帮助将不胜感激。
我的答案
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)