在SML中获取另一个函数作为参数的函数

时间:2018-04-13 15:19:06

标签: sml ml

考虑函数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;

但它不起作用。有什么建议?

2 个答案:

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