Если у вас установлена библиотека OCaml Core, то это просто:
open Core.Std
let r file = In_channel.read_lines file
Если у вас установлено corebuild
, вы можете просто скомпилировать свой код:
corebuild filename.byte
, если ваш код находится в файле с именем filename.ml
.
Если у вас нет OCaml Core, или вы не хотите его устанавливать, или какая-то другая реализация стандартной библиотеки, то, конечно, вы можете реализовать его с помощью стандартной библиотеки OCaml ванили. Существует функция input_line
, определенная в модуле Pervasives
, которая автоматически открывается во всех программах OCaml (т. Е. Все ее определения доступны без дополнительных пояснений с именем модуля). Эта функция принимает значение типа in_channel
и возвращает строку, прочитанную из канала. С помощью этой функции вы можете реализовать требуемую функцию:
let read_lines name : string list =
let ic = open_in name in
let try_read () =
try Some (input_line ic) with End_of_file -> None in
let rec loop acc = match try_read () with
| Some s -> loop (s :: acc)
| None -> close_in ic; List.rev acc in
loop []
Эта реализация использует рекурсию и является гораздо более естественной для программирования OCaml.