为什么当我使用 function 关键字时这个函数是弱类型?奥卡米尔

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)

Jef*_*eld 9

这就是值的限制。您的函数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;放宽价值限制