Sml 如何使将数据写入文件的函数给出布尔输出?

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

我必须编写一个代码,将整数列表写入一个文件。同时,如果元素已写入,则返回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)
错误:子句右侧与函数结果类型不一致[tycon不匹配]
表达式:单位
结果类型:bool
在声明中:
写数=
(fn(无,sfile)=>真
|(:,sfile)=>
让瓦尔
val in(;)end)

函数体必须具有函数结果类型约束中指定的类型。

函数体必须具有函数结果类型约束中指定的类型。

由于以下原因,
writetofile
的基本情况具有type
bool
而归纳情况具有type
unit
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=>[],但不起作用。要处理异常,请查看此问题。我建议您从一个非常简单的示例开始,尝试添加异常处理。如果您有任何具体的问题,您可以在这里发布一个问题,以便人们能够提供帮助。