Редактировать: Не обращайте внимания на этот вопрос! См. Комментарии ниже.
Мне нужно выражение OCaml, которое передается в файл (как "in_channel"), затем читает файл построчно, выполняя некоторую обработку до конца, а затем возвращает результат обработки.
Я написал этот тест:
let rec sampler_string file string_so_far =
try
let line = input_line file in
let first_two_letters = String.sub line 0 2 in
sampler_string file (string_so_far ^ first_two_letters)
with End_of_file -> string_so_far;;
let a = sampler_string (open_in Sys.argv.(1)) "";;
(Здесь «выполнение некоторой обработки» - это добавление первых двух символов каждой строки к текущему счетчику, и идея состоит в том, что в конце должна быть возвращена строка, содержащая первые два символа каждой строки.)
Это не работает: OCaml считает, что "sampler_string" создает что-то типа unit, а не типа string . (Затем возникают трудности, когда я пытаюсь использовать результат в виде строки.) Я думаю, что эта проблема связана с тем, что единственный базовый случай происходит в исключительной ситуации (файл End_of_file).
Итак, конкретный вопрос и общий вопрос:
- Есть ли способ исправить этот код, явно указав OCaml ожидать, что результатом sampler_string должна быть строка?
- Существует ли какой-то стандартный, лучший синтаксис для подпрограммы, которая считывает файл строка за строкой и возвращает результат построчной обработки?