gpt4 book ai didi

functional-programming - 为什么当我使用 function 关键字时这个函数有弱类型? OCaml

转载 作者:行者123 更新时间:2023-12-05 08:45:28 27 4
gpt4 key购买 nike

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' [];;

如果我添加第二个参数,该参数必须是一个列表并在其上使用“匹配”,代码就可以工作。

(也:代码的结尾和:一式两份的[]'参数')

如果我使用 function 关键字并使代码更简洁,则函数返回:

val duplicates : '_weak14 list -> '_weak14 list = <fun>

最佳答案

这是值限制。您的函数 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>
#

这是有效的,因为 duplicates 现在被定义为使用紧凑符号 let f x = e 的 lambda,等同于 let f = fun x -> e.

值限制记录在 OCaml 手册的第 6 节中,"Polymorphism and its limitations."

我发现以下论文对思考值限制非常有帮助:Garrigue, Jacques; Relaxing the Value Restriction .

关于functional-programming - 为什么当我使用 function 关键字时这个函数有弱类型? OCaml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72635429/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com