Как прочитать пару за парой из файла в SML? - PullRequest
0 голосов
/ 29 апреля 2020

Я хочу прочитать N пар из файла и сохранить их в виде кортежей в списке. Например, если у меня есть эти 3 пары: 1-2, 7-3, 2-9, я хочу, чтобы мой список выглядел следующим образом -> [(1,2), (7,3), (2-9)]

Я пробовал что-то вроде этого:

   fun ex filename = 
 let
   fun readInt input = Option.valOf (TextIO.scanStream (Int.scan StringCvt.DEC) input)
   val instream = TextIO.openIn filename
   val T = readInt instream (*number of pairs*)
   val _ = TextIO.inputLine instream


fun read_ints2 (x,acc) =
if x = 0 then acc
else read_ints2(x-1,(readInt instream,readInt instream)::acc)
in
 ...
end

Когда я запускаю его, я получаю исключение ошибка: / что не так ??

1 Ответ

0 голосов
/ 30 апреля 2020

Я придумал это решение. Я читаю одну строку из данного файла. При обработке текста он удаляет все, кроме git, создавая единый плоский список символов. Затем он разбивает плоский список символов на список пар и в процессе преобразует символы в целые. Я уверен, что это может быть улучшено.

fun readIntPairs file =
    let val is = TextIO.openIn file
    in
        case (TextIO.inputLine is)
        of NONE => ""
         | SOME line => line
    end

fun parseIntPairs data =
    let val cs = (List.filter Char.isDigit) (explode data)
        fun toInt c =
            case Int.fromString (str c)
             of NONE => 0
              | SOME i => i
        fun part [] = []
          | part [x] = []
          | part (x::y::zs) = (toInt x,toInt y)::part(zs)
    in
        part cs
    end

 parseIntPairs (readIntPairs "pairs.txt");
...