2013-11-22 12 views
2

我在使用Core库的Real World OCaml的同时编写了以下函数。使用OCaml/Core模块的习惯用法?

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 

它看起来杂乱无章我,因为我有很多的“打开”的顶部,我不得不名单,数组,SYS Fn键,然后在所有的,我使用的功能的其他模块的名称。这是编写OCaml的“正确”方式?是否有一种标准风格取消了这些?

+1

您不需要前两行:Core.Core_list是Core.Std.List和Core.Option到Core.Std.Option的别名。所以,我通常使用'open Core','open Core.Std'并且玩得开心 – Kakadu

+0

@Kakadu为什么不把它当作答案? – lukstafi

+0

@Kakadu我尝试过'打开Core'和'打开Core.Std',但我没有访问像'flip'或'nnth'这样的函数。听起来我仍然需要命名许多模块。这是写Ocaml代码的正确方法吗? – Ana

回答

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