Nếu bạn có thư viện OCaml Lõi cài đặt, sau đó nó cũng đơn giản như:
open Core.Std
let r file = In_channel.read_lines file
Nếu bạn có corebuild
cài đặt, sau đó bạn có thể chỉ cần biên dịch mã của bạn với nó:
corebuild filename.byte
nếu mã của bạn nằm trong tệp có tên filename.ml
.
Nếu bạn không có lõi OCaml, hoặc không muốn cài đặt hoặc thực hiện một số thư viện chuẩn khác, thì tất nhiên, bạn có thể triển khai nó bằng thư viện chuẩn của vanilla OCaml. Có một hàm input_line
, được định nghĩa trong mô-đun Pervasives
, được tự động mở trong tất cả các chương trình OCaml (nghĩa là tất cả các định nghĩa của nó có thể truy cập được mà không cần làm rõ thêm với tên mô-đun). Hàm này chấp nhận giá trị loại in_channel
và trả về một dòng, được đọc từ kênh. Sử dụng chức năng này, bạn có thể thực hiện chức năng được yêu cầu:
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 []
Thực hiện này sử dụng đệ quy và tự nhiên hơn với lập trình OCaml.
Cảm ơn bạn rất nhiều! – Travis
phát hiện rò rỉ fd trong biến thể extlib: kênh đầu vào không được đóng – ygrek
Bạn có thể giải thích tại sao bạn đang chuỗi vòng lặp trong khi có danh sách trống không? Tôi nghĩ rằng nó không bao giờ đạt được. – Rizo