函数,该函数在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的平方根。