從標準輸入讀取並列印到標準輸出

我們準備了一個名為 reverser.ml 的檔案,其中包含以下內容:

let acc = ref [] in
    try
        while true do
            acc := read_line () :: !acc;
        done
    with
        End_of_file -> print_string (String.concat "\n" !acc)

然後我們使用以下命令編譯我們的程式:

$ ocamlc -o reverser.byte reverser.ml

我們通過將資料傳輸到新的可執行檔案來測試它:

$ cat data.txt
one
two
three
$ ./reverser.byte < data.txt
three
two
one

reserver.ml 程式以命令式風格編寫。雖然命令式風格很好,但將它與功能翻譯進行比較是很有趣的:

let maybe_read_line () =
  try Some(read_line())
  with End_of_file -> None

let rec loop acc =
  match maybe_read_line () with
  | Some(line) -> loop (line::acc)
  | None -> List.iter print_endline acc

let () = loop []

由於引入了 maybe_read_line 功能,第二個版本的控制流程比第一個版本簡單得多。