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がありますが、誘導ケースにはタイプunitTextIO.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
于 2012-10-22T11:12:04.243 に答える