我必须编写一个采用整数列表并将它们写入文件的代码。同时,如果写入元素,则返回true;否则,如果未写入,则返回false。
我写了类似
的内容fun writetofile([],sfile)= false
|writetofile((l:int)::ls, sfile)=
let
val outs=TextIO.openOut(sfile)
fun writeinline(outs,[])=(false;TextIO.closeOut(outs))
|writeinline(outs,(l:int)::ls)=(true;TextIO.output(outs,(Int.toString(l)^"\n"));writeinline(outs,ls))
in
writeinline(outs,l::ls) before
TextIO.closeOut(outs)
end
;
我收到了以下错误:
Error: right-hand-side of clause doesn't agree with function result type [tycon mismatch]
expression: unit
result type: bool
in declaration:
writeNums =
(fn (nil,sfile) => true
| (:: <pat>,sfile) =>
let val <binding>
val <binding> in (<exp>; <exp>) end)
答案 0 :(得分:2)
函数体必须具有在函数结果类型约束中指定的类型。
答案 1 :(得分:1)
writetofile
的基本案例的类型为bool
,而由于unit
,归纳案例的类型为TextIO.closeOut(outs)
;因此,他们不同意该功能的返回类型。
如果您想在归纳案例中返回bool,则需要TextIO.closeOut(outs); true
之类的内容。
顺便说一句,您的writeinline
函数始终返回unit
,因此您不需要使用未使用的false
,true
值。这是一个更正版本:
fun writetofile([], sfile) = false
| writetofile((l:int)::ls, sfile) =
let
val outs = TextIO.openOut(sfile)
fun writeinline(outs,[]) = TextIO.closeOut(outs)
| writeinline(outs, l::ls)= ( TextIO.output(outs (Int.toString(l)^"\n"));
writeinline(outs, ls) )
in
( writeinline(outs, l::ls);
TextIO.closeOut(outs);
true )
end