我正在尝试在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);
我收到以下错误
Cml.sml:3.5-10.8 Error: right-hand-side of clause doesn't agree with function result type [circularity]
expression: unit -> 'Z
result type: 'Z
in declaration:
sender = (fn arg => (fn <pat> => <exp>))
我做错了什么?
答案 0 :(得分:1)
您的功能sender
以
fun sender n()= ...
给它类型
sender : int -> unit -> 'a
您需要main
中的定义。但是,当您稍后以递归方式调用它时,将其称为
sender n+1
现在,即使你把它写成
sender (n+1)
要获得正确的优先级,您仍然可以获得类型unit -> 'a
,而您需要类型'a
。所以你需要做的就是向它传递额外的() : unit
,并且你的sender
函数将进行类型检查:
fun sender n () =
if (n<100)
then (
TextIO.print (Int.toString(n)^"\n");
sender n+1 ())
else exit ()