2013-11-22 36 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