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

函数,该函数在SML中获取另一个函数作为参数,sml,ml,Sml,Ml,考虑函数g获取整数,如果整数大于之前确定的某个随机常量正值,则返回true,否则返回false 我想在SML中编写一个函数f,它将函数g作为参数。此函数f应返回之前确定的随机常数正值 算法(其他语言,C或其他语言): 这就是我在SML中尝试的: fun f g = let val num = 1; in while !(g num) do ( val num = num + 1; ); num end; 但它不起作用。有什么建议吗 val nu

考虑函数
g
获取
整数
,如果
整数
大于之前确定的某个随机常量正值,则返回true,否则返回false

我想在SML中编写一个函数
f
,它将函数
g
作为参数。此函数
f
应返回之前确定的随机常数正值

算法(其他语言,C或其他语言):

这就是我在SML中尝试的:

fun f g = 
let
    val num = 1;
in
    while !(g num) do (
        val num = num + 1;
    );
    num
end;
但它不起作用。有什么建议吗

val num = num + 1;
首先,
val
仅允许在顶层或
let
内部使用。其次,它定义了一个新的变量。因此,在您的C代码中,它相当于:

int num = num + 1;
而不是:

num = num + 1;
换句话说,它创建了一个新变量,而不是修改现有变量,这对您没有帮助

因此,自然的后续问题将是如何执行
num=num+1
。最直接的答案是:你没有。SML中的所有变量都是不可变的,因此不能重新分配变量。但是,您可以通过使用可更改的
ref
s来解决此问题

然而,在SML中实现这一点的正确方法是根本不使用
而使用
循环或重新赋值,而是使用递归

首先,
val
仅允许在顶层或
let
内部使用。其次,它定义了一个新的变量。因此,在您的C代码中,它相当于:

int num = num + 1;
而不是:

num = num + 1;
换句话说,它创建了一个新变量,而不是修改现有变量,这对您没有帮助

因此,自然的后续问题将是如何执行
num=num+1
。最直接的答案是:你没有。SML中的所有变量都是不可变的,因此不能重新分配变量。但是,您可以通过使用可更改的
ref
s来解决此问题


然而,在SML中实现这一点的正确方法是在循环或重新分配时不使用
,而是使用递归。

正如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

正如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

你的C代码应该说
intf(bool(*g)(int)){…
,对吗?你的C代码应该说
intf(bool(*g)(int)){…
,对吗?我应该如何在这里使用递归?我应该如何在这里使用递归?谢谢!你如何测试它?
valx=fg
什么?例如,
valx=f(fn=>n*n=256)
将为您找到256的平方根。谢谢!您如何测试它?
valx=fg
一些东西?例如,
valx=f(fn=>n*n=256)
将为您找到256的平方根。