SML递归调用函数

SML递归调用函数,sml,Sml,我试图在SML中实现一个递归调用函数。我的代码是 CM.make "$cml/cml.cm"; open CML; fun sender n()= if (n<100) then ( TextIO.print (Int.toString(n)^"\n"); sender n+1 ) else exit () fun main () = let val _ = spawn (sender 3); val tid1 = getTid(); in TextIO.pri

我试图在SML中实现一个递归调用函数。我的代码是

CM.make "$cml/cml.cm";
open CML;
fun sender n()= if (n<100)
then 
(
TextIO.print (Int.toString(n)^"\n");
sender n+1
)
else
exit ()

fun main () = let
    val _ = spawn (sender 3);
    val tid1 = getTid();
in
    TextIO.print("MY TID" ^ (tidToString tid1)^"\n")
end;
RunCML.doit(main, NONE);
CM.make“$cml/cml.CM”;
开放性慢性粒细胞白血病;

fun sender n()=如果(n您的函数
sender

fun sender n()= ...
这就是它的类型

sender : int -> unit -> 'a
正如您需要在
main
中定义一样。但是,当您以后递归调用它时,您将其称为

sender n+1
现在,即使你把它写成

sender (n+1)
要获得正确的先例,您仍然可以获得类型
unit->'a
,而您想要的是类型
'a
。因此,您需要做的就是向它传递一个额外的
():unit
,并且
发送方
函数将进行类型检查:

fun sender n () =
    if (n<100)
    then (
        TextIO.print (Int.toString(n)^"\n");
        sender n+1 ())
    else exit ()
n()=

如果(nThanks像一个符咒一样工作,我对SML中的()运算符有一些怀疑,如果我删除它,我的代码会工作。并且在调用sender时不要传递(),那么在代码中包含它有什么意义呢?您可以定义
fun sender'n=…
,并且它在没有额外的
()
,但稍后您需要使用
spawn
来生成并行执行
sender
的线程。根据设计,
spawn
采用一个
unit->unit
,因此您必须使用
sender'
来遵守这一点。当然,您可以通过
spawn(fn()=>sender'3)
来实现这一点。