【发布时间】:2019-02-26 18:46:12
【问题描述】:
以下代码sn-p来自官方OCamlwebsite:
# let rec compress = function
| a :: (b :: _ as t) -> if a = b then compress t else a :: compress t
| smaller -> smaller;;
val compress : 'a list -> 'a list = <fun>
上述函数“压缩”具有连续重复元素的列表,例如:
# compress ["a";"a";"a";"a";"b";"c";"c";"a";"a";"d";"e";"e";"e";"e"];;
- : string list = ["a"; "b"; "c"; "a"; "d"; "e"]
我对上述代码的逻辑非常了解。我习惯于命令式地编码,所以这种递归的、函数式的方法,结合 OCamls 简洁但晦涩的语法让我很挣扎。
例如,基本情况在哪里?是smaller -> smaller吗?我知道smaller 是一个变量或标识符,但它返回的是什么(甚至在 OCaml 中返回正确的术语来说明这里发生的事情)?
我知道 OCaml 中的列表是单链接的,所以我也想知道是否正在生成新列表,或者是否正在剪切现有列表的元素?由于 OCaml 是功能性的,我倾向于认为列表是不可变的——对吗?如果您想更改列表,您基本上需要生成一个新列表,其中包含您要添加的元素(或您要删除的元素)。这是正确的理解吗?
【问题讨论】:
标签: recursion functional-programming ocaml