OCaml中两种列表拆分函数实现:哪种更符合函数式编程最佳实践?
OCaml列表拆分函数的实现对比:函数式风格与最佳实践
本人具备函数式编程(FP)经验,在网上找到一个将列表拆分为两半的split函数实现:
let split l = let n = List.length l in let rec splitAt k l = match k, l with | 0, _ -> [], l | _, [] -> [], [] | _, x::xs -> let l, r = splitAt (k-1) xs in x::l, r in splitAt (n/2) l
该函数可正常运行,但理解起来稍显晦涩。如果让我编写列表拆分函数,我会写出如下split2实现:
let split2 l = let n = List.length l in let rec splitAt k acc l = if k=0 then (List.rev acc, l) else match l with | [] -> [], [] | h::t -> splitAt (k-1) (h::acc) t in splitAt (n/2) [] l
我认为split2的核心逻辑一目了然,但split的逻辑起初理解起来略有难度。现咨询:从函数式编程风格及OCaml最佳实践角度,哪种实现更优?
注:本文讨论的是两种函数的核心实现逻辑,而非语法细节(如代码中if-then-else与模式匹配的差异)
内容的提问来源于stack exchange,提问作者lil_papa
相关产品推荐
相关产品推荐

