3

私は OCaml を初めて使用し、クラスを監査しています。「merge xs ys は、それぞれ昇順でソートされた 2 つの整数リストを取得し、1 つのマージされたリストをソート順に返します」

私はうまく機能する関数を書きました:

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 に答える