如何创建一个将数据写入文件的函数给出布尔输出?

时间:2012-10-22 08:49:48

标签: 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))
    |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)

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

writetofile的基本案例的类型为bool,而由于unit,归纳案例的类型为TextIO.closeOut(outs);因此,他们不同意该功能的返回类型。

如果您想在归纳案例中返回bool,则需要TextIO.closeOut(outs); true之类的内容。

顺便说一句,您的writeinline函数始终返回unit,因此您不需要使用未使用的falsetrue值。这是一个更正版本:

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