考虑函数g
获取integer
并且如果integer
大于之前确定的某个随机const正值,则返回true,否则返回false。
我想在SML中编写一个函数f
,它将函数g
作为参数。这个函数f
应该返回之前决定的随机const正值。
算法(在某些其他语言中,C或其他):
int f(int num) {
int num = 1;
while(!g(num)) {
num++;
}
return num;
}
现在这是我在SML中尝试过的:
fun f g =
let
val num = 1;
in
while !(g num) do (
val num = num + 1;
);
num
end;
但它不起作用。有什么建议?
答案 0 :(得分:1)
val num = num + 1;
首先,val
仅允许位于顶层或let
内。其次,它定义了一个新变量。所以在你的C代码中,它等同于:
int num = num + 1;
而不是:
num = num + 1;
换句话说,它创建一个新变量而不是修改现有变量,这对你没有帮助。
因此,自然的后续问题就是你如何做num = num + 1
。而最直接的答案是:你没有。 SML中的所有变量都是不可变的,因此您无法重新分配变量。但是,您可以使用ref
s来解决此问题,这是可变的。
然而,在SML中执行此操作的正确方法是不使用while
循环或重新分配,而是使用递归。
答案 1 :(得分:1)
正如sepp2k所解释的那样,你的问题与g
的传递无关,而是你如何尝试定义一个循环。这是使用递归实现它的一种方法,这通常是你在ML中所做的:
fun f' g n = if g n then n else f' g (n + 1)
fun f g = f' g 1
或者如果您想将辅助功能保持在本地:
fun f g =
let fun loop n = if g n then n else loop (n + 1)
in loop 1 end