我是OCaml的新手,我正在审核课程。我有一个作业提示,上面写着: “合并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。
感谢。
答案 0 :(得分: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
我认为这可以更好地捕捉问题的对称性。
当代码的长度与它解决的问题的简单性相匹配时,我认为这很好。合并很简单,所以代码不应该很长(在我看来)。