0

我必须编写一个接受整数列表并将它们写入文件的代码。同时如果元素被写入则返回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)
4

2 回答 2

2

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

于 2012-10-22T09:00:40.597 回答
1

基本情况writetofile有类型bool,而归纳情况有类型unit由于TextIO.closeOut(outs); 所以他们不同意函数的返回类型。

如果您想在归纳情况下返回 bool,则需要类似TextIO.closeOut(outs); true.

顺便说一句,你的writeinline函数总是返回,unit所以你不需要 used值。这是一个更正的版本: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
于 2012-10-22T11:12:04.243 回答