2016-05-04 16 views
0

輸入:只包含1與它SML/NJ:提取了許多的數字爲一個int列表

輸出整行的文本文件:用數字的位數

這裏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

先到這裏的問題是,在eSOME e已經是char,你不必「解壓」它valOf

的第二個問題是,即使你刪除valOf(和你的程序將進行類型檢查),從文件中讀取數字的企圖將導致運行時錯誤是這樣的:

$ 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 另外,你是對的,我應該檢查新的行字符。我沒有這麼做的唯一原因是因爲我知道該文件只包含一行,所以沒有任何讀'\ n'字符的風險。但是,最好是安全,而不是抱歉。 謝謝! – Orion

+0

@Orion(1)例如'echo「12345」> digits.txt'會插入它(可以使用'-n'選項來避免); (2)你不需要文件後也應該關閉文件描述符 –

+0

(1)你說得對,我用編輯器創建了這個文件,在這種情況下沒有添加任何不必要的'\ n'。 (2)注意。再次感謝! :) – Orion

相關問題