Sml 如何使将数据写入文件的函数给出布尔输出?
我必须编写一个代码,将整数列表写入一个文件。同时,如果元素已写入,则返回true;如果未写入,则返回false 我写了这样的东西Sml 如何使将数据写入文件的函数给出布尔输出?,sml,smlnj,Sml,Smlnj,我必须编写一个代码,将整数列表写入一个文件。同时,如果元素已写入,则返回true;如果未写入,则返回false 我写了这样的东西 fun writetofile([],sfile)= false |writetofile((l:int)::ls, sfile)= let val outs=TextIO.openOut(sfile) fun writeinline(outs,[])=(false;TextIO.closeOut(outs)) |writeinli
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)
错误:子句右侧与函数结果类型不一致[tycon不匹配]
表达式:单位
结果类型:bool
在声明中:
写数=
(fn(无,sfile)=>真
|(:,sfile)=>
让瓦尔
val in(;)end)
函数体必须具有函数结果类型约束中指定的类型。函数体必须具有函数结果类型约束中指定的类型。由于以下原因,writetofile
的基本情况具有typebool
而归纳情况具有typeunit
TextIO.closeOut(结算)
;所以他们不同意函数的返回类型
如果您想在感应情况下返回bool,您需要类似于TextIO.closeOut(关闭)的内容;正确
顺便说一句,您的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
writetofile
的基本情况为类型bool
,而感应情况为类型单元
,原因是TextIO.closeOut(outs)
;所以他们不同意函数的返回类型
如果您想在感应情况下返回bool,您需要类似于TextIO.closeOut(关闭)的内容;正确
顺便说一句,您的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
对我在你发帖之前就知道了,但我仍然不知道为什么在let之前写true和在textio.closeOut(收尾)之后写true是不同的;你能帮我吗?我在其他地方发布了它,但是,如果找不到文件,如何“处理”或返回[]。不是在上述情况下,而是在写入文件时。如果文件不存在,则引发异常Io。我需要处理它以返回空列表。我编写了handle Io=>[],但不起作用。要处理异常,请查看此问题。我建议您从一个非常简单的示例开始,尝试添加异常处理。如果你有任何具体的问题,你可以在这里发布一个问题,这样人们可以帮助你。是的。我在你发帖之前就知道了,但我仍然不知道为什么在let之前写true和在textio.closeOut(收尾)之后写true是不同的;你能帮我吗?我在其他地方发布了它,但是,如果找不到文件,如何“处理”或返回[]。不是在上述情况下,而是在写入文件时。如果文件不存在,则引发异常Io。我需要处理它以返回空列表。我编写了handle Io=>[],但不起作用。要处理异常,请查看此问题。我建议您从一个非常简单的示例开始,尝试添加异常处理。如果您有任何具体的问题,您可以在这里发布一个问题,以便人们能够提供帮助。