копирование файлов в sml

Я пытаюсь изучить ввод-вывод в sml. Пытаясь скопировать строки ls, которые совпадают с s1, в файл l2, я сделал следующее. Я получаю некоторые ошибки, которые я не могу понять. Может кто-нибудь мне помочь.

fun test(l2:string,ls:string list,s1:string) = if (String.isSubstring(s1 hd(ls))) then

                       (TextIO.openOut l2; TextIO.inputLine hd(ls))::test(l2,tl(ls),s1) else 

                       test(l2,tl(ls),s1);

person Emma    schedule 08.11.2013    source источник


Ответы (1)


Вот несколько общих советов:

  1. Назовите переменные осмысленно, например filename, lines и line.
  2. Функция TextIO.inputLine принимает в качестве аргумента значение типа instream.
  3. Когда вы пишете TextIO.inputLine hd(ls), это на самом деле интерпретируется как (TextIO.inputLine hd) ls, что означает «обрабатывать hd, как если бы это было instream, и пытаться прочитать из него строку, взять эту строку и обработать ее, как если бы это была функция, и применить ее. на ls", что, конечно, полная ерунда.

    Правильная скобка в этом случае будет TextIO.inputLine (hd ls), что по-прежнему не имеет смысла, поскольку мы решили, что ls — это string list, и поэтому hd ls будет string, а не instream.

Вот что-то похожее на то, что вы хотите сделать, но наоборот:

(* Open a file, read each line from file and return those that contain mySubstr *)
fun test (filename, mySubstr) =
    let val instr = TextIO.openIn filename
        fun loop () = case TextIO.inputLine instr of
                          SOME line => if String.isSubstring mySubstr line
                                       then line :: loop () else loop ()
                        | NONE => []
        val lines = loop ()
        val _ = TextIO.closeIn instr
    in lines end

Вместо этого вам нужно использовать TextIO.openOut и TextIO.output. TextIO.inputLine — это тот, который читает из файлов.

person Simon Shine    schedule 08.11.2013
comment
это помогло, но я не понимаю val _ = TextIO.closeIn instr. Я не знал, что функция может принимать () в качестве аргумента. Можете ли вы также сказать что-нибудь о () здесь. - person Emma; 09.11.2013
comment
Похоже, вы хотите прочитать книгу о Standard ML. () — единственное значение для типа unit. Пожалуйста, иди и посмотри. - person Simon Shine; 11.11.2013