我在跟随使用Core库的Real World OCaml时编写了以下函数。
open Core.Core_list
open Core.Option
open Core.Std
open Re2
let getMaxFilename target =
let Ok pat = Regex.create "^.*(..)\\.txt$" in
Sys.ls_dir target |>
List.map ~f:(Regex.find_submatches pat) |>
List.filter ~f:is_ok |>
List.map ~f:(fun x -> ok_exn x |> Array.to_list |> (Fn.flip nth_exn) 1 |> fun x -> value_exn x) |>
List.reduce ~f:max
我看起来很麻烦,因为我在顶部有很多“打开”,我必须在我使用的所有函数中命名List,Array,Sys,Fn和其他模块名称。这是编写OCaml的“正确”方式吗?有没有一种标准风格可以省去这些?
答案 0 :(得分:0)
我不确定这是做到这一点的最好方法,但这里是一个相当直接的风格清理,没有真正做任何重要的事情。
open Core.Std
module Regex = Re2.Regex
let get_max_filename target =
let pat = Regex.create_exn "^.*(..)\\.txt$" in
Sys.ls_dir target
|> List.map ~f:(Regex.find_submatches pat)
|> List.filter_map ~f:Result.ok
|> List.filter_map ~f:(fun x -> x.(1))
|> List.reduce ~f:max
一般来说,open
的大量使用是不受欢迎的。
以下内容可能更清晰,更容易理解。
let get_max_filename target =
let pat = Regex.create_exn "^.*(..)\\.txt$" in
Sys.ls_dir target
|> List.filter_map ~f:(fun entry ->
match Regex.find_submatches pat entry with
| Error _ -> None
| Ok ar -> ar.(1))
|> List.reduce ~f:max