【发布时间】:2016-04-29 14:27:03
【问题描述】:
我是 OCaml 的新手,正在阅读 Real World OCaml (RWO) 书籍。模式匹配在第 3 章中进行了描述,与 Erlang(或 Prolog)的模式匹配相比似乎很弱。
我的问题是:
- 为什么 OCaml 的模式匹配较弱?
- OCaml 的模式匹配风格有什么优势吗?
一个具体的例子:
以下函数(取自 RWO 第 63 页)对列表进行去扰
let rec destutter list =
match list with
| [] -> []
| [hd] -> [hd]
| hd :: hd' :: tl ->
if hd = hd' then ds1 (hd' :: tl)
else hd :: ds1 (hd' :: tl)
;;
# destutter [1;2;3;3;4;5;5;6];;
- : int list = [1; 2; 3; 4; 5; 6]
在 Erlang 中,可以(而且我认为更可取)使用模式匹配而不是条件匹配:
destutter([]) -> [];
destutter([X]) -> [X];
destutter([H,H|T]) -> destutter([H|T]);
destutter([H|T]) -> [H | destutter(T)].
在 OCaml 中尝试这种事情......
let rec destutter list =
match list with
| [] -> []
| [hd] -> [hd]
| hd :: hd :: tl -> destutter tl (* error *)
| hd :: tl -> hd :: destutter tl
;;
... 在标记的行上引发错误:
Error: Variable hd is bound several times in this matching
因此,Erlang/Prolog 样式的模式匹配在 OCaml 中不起作用。为什么? OCaml 方法的优点是什么?
感谢和祝福
伊万
【问题讨论】:
标签: erlang pattern-matching ocaml