使用OCaml / Core模块的惯用方法?

时间:2013-11-22 16:20:46

标签: ocaml

我在跟随使用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的“正确”方式吗?有没有一种标准风格可以省去这些?

1 个答案:

答案 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