3

我是 OCaml 的新手,我正在审核一堂课。我有一个作业提示,上面写着:“merge xs ys 采用两个整数列表,每个列表按升序排序,并返回一个按排序顺序的合并列表。”

我已经成功编写了一个有效的函数:

let rec merge xs ys = match xs with
  | [] -> ys
  | hxs::txs -> if hxs <= (match ys with
    | [] -> hxs
    | hys::tys -> hys)
      then hxs :: merge txs ys 
      else match ys with
      | [] -> xs
      | hys::tys -> hys :: merge xs tys  in
merge [-1;2;3;100] [-1;5;1001]
;;

我想知道我的代码是否被认为是可接受的 OCaml 样式?我想避免养成任何坏习惯。感觉组合密集,但也许那是因为我仍然不习惯 OCaml。

谢谢。

4

1 回答 1

5

我个人觉得很难if hxs <= (match ...)理解,而且很难很好地格式化它。所以我可能会写

 ...
 let hys =
   match ys with
   | [] -> hxs
   | hys :: _ -> hys
 in
 if hxs < hys then
    hxs :: merge txs ys
 ...

xs但是,我认为同时匹配两者可能会更好ys

let rec merge xs ys =
   match xs, ys with
   | [], _ -> ys
   | _, [] -> xs
   | hx :: txs, hy :: tys ->
       if hx < hy then hx :: merge txs ys else hy :: merge xs tys

我认为这更好地捕捉了问题的对称性。

我认为当代码的长度与它解决的问题的简单性很好地匹配时,这很好。合并很容易说明,因此代码不需要很长(在我看来)。

于 2013-04-20T05:59:09.393 回答