Den*_*uia 2 ocaml functional-programming
let duplicates =
let rec duplicates' accumulator = function
| [] -> accumulator
| [ item ] -> duplicates' (item :: accumulator) []
| item :: item2 :: tail ->
if item = item2 then duplicates' (item :: accumulator) tail
else duplicates' (item::accumulator) (item2::tail)
in
duplicates' [];;
Run Code Online (Sandbox Code Playgroud)
如果我添加第二个参数,该参数必须是“列表”并在其上使用“匹配”,则代码可以正常工作。
(另外:代码结尾和:重复 [] '参数')
如果我使用 function 关键字并使代码更简洁,则函数返回:
val duplicates : '_weak14 list -> '_weak14 list = <fun>
Run Code Online (Sandbox Code Playgroud)
这就是值的限制。您的函数duplicates
不是由值(即 lambda)定义的,而是由应用程序定义的:duplicates' []
。所以不能一概而论。
您可以使用 eta 扩展来修复此问题:
# let duplicates list =
let rec duplicates' accumulator = function
| [] -> accumulator
| [ item ] -> duplicates' (item :: accumulator) []
| item :: item2 :: tail ->
if item = item2 then duplicates' (item :: accumulator) tail
else duplicates' (item::accumulator) (item2::tail)
in
duplicates' [] list ;;
val duplicates : 'a list -> 'a list = <fun>
#
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为duplicates
现在使用紧凑符号 定义为 lambda let f x = e
,相当于let f = fun x -> e
.
该值限制记录在 OCaml 手册的第 6 节“多态性及其限制”中。
我发现以下论文对于思考价值限制非常有帮助:Garrigue,Jacques;放宽价值限制。