2016-05-04 9 views
0

入力int型のリストに番号の桁数を抽出:テキストそれの整数で唯一の1行を含むファイルSML/NJ:

出力:番号の桁数を持つint型のリスト

は、ここに私のコードです:

fun parse file = 
    let 
    val input = TextIO.openIn file 

    fun read_digits (NONE,acc) = rev acc 
     | read_digits (SOME e,acc) = 
     let 
      val c = Option.valOf (e) 
      val str = Char.toString c 
      val digit = Option.valOf (Int.fromString str) 
     in 
      read_digits (TextIO.input1 input,digit::acc) 
     end 
    in 
    read_digits (TextIO.input1 input,nil: int list) 
    end 

そして、ここで私が得ていたエラーメッセージです:

test.sml:14.11-14.55 Error: operator and operand don't agree [tycon mismatch] 
    operator domain: char option option * int list 
    operand:   TextIO.elem option * int list 
    in expression: 
    read_digits (TextIO.input1 input,digit :: acc) 
test.sml:17.5-17.52 Error: operator and operand don't agree [tycon mismatch] 
    operator domain: char option option * int list 
    operand:   TextIO.elem option * int list 
    in expression: 
    read_digits (TextIO.input1 input,nil: int list) 

uncaught exception Error 
    raised at: ../compiler/TopLevel/interact/evalloop.sml:66.19-66.27 
      ../compiler/TopLevel/interact/evalloop.sml:44.55 
      ../compiler/TopLevel/interact/evalloop.sml:292.17-292.20 

は、任意の提案どのように問題に対処するのですか?

それ以外の人は、数字の数字をテキストファイルからintリストに抽出する方が良いでしょうか?

答えて

0

ここでの最初の問題は、SOME eeが既にcharで、あなたはvalOfとそれを「解凍」する必要がないことです。

第二の問題は、あなたがvalOf(とあなたのプログラムは、です。TypeCheckます)ことを削除した後でも、ファイルから数字を読み取ろうが、このような実行時エラーになりますということです。

$ cat digits.txt 
12345 
$ smlnj read_digits_from_file.sml 
... 
- parse "digits.txt"; 

uncaught exception Option 
    raised at: Basis/Implementation/option.sml:17.25-17.31 

こと行末の文字のためです。簡単なテスト

fun parse file = 
    let 
    val input = TextIO.openIn file 

    fun read_digits (NONE, acc) = acc (* end of stream *) 
     | read_digits (SOME ch, acc) = 
     let 
      val str = Char.toString ch 
     in 
      case (Int.fromString str) of 
       SOME digit => read_digits (TextIO.input1 input, digit::acc) 
      | NONE => acc (* return on first non-digit *) 
     end 
    in 
    rev (read_digits (TextIO.input1 input, [])) (* rev moved here *) 

:これを解決するには、このような何かを行うことができ

- parse "digits.txt"; 
val it = [1,2,3,4,5] : int list 
+0

ありがとうございました! :D また、あなたは正しいです、私は新しい行の文字を確認する必要があります。私がしなかった唯一の理由は、ファイルには1行しか含まれていないことが分かっていたため、 '\ n'文字を読み取るリスクはありませんでした。しかし、残念ながら安全である方が常に良いです。 ありがとう! – Orion

+0

@Orion(1)たとえば 'echo" 12345 "> digits.txt'はそれを挿入します(ただし、' -n'オプションを使用して回避することもできます)。 (2)あなたはファイルをもう必要としなくてもファイル記述子を閉じるべきです –

+0

(1)そうです、エディタでファイルを作成しました。この場合、不要な '\ n'は追加されませんでした。 (2)注目。再度、感謝します! :) – Orion