摆脱价值限制错误

问题描述

| 在OCaml中
Objective Caml version 3.11.0

# let rec last l=
    match l with
    [] -> failwith(\"Empty list\")
    |a::[] -> a
    |a::r -> last r;;
val last : \'a list -> \'a = <fun>
# last [];;
Exception: Failure \"Empty list\".
在F#中
>let rec last l = 
    match l with
    [] -> failwith(\"Empty list\")
    | a::[] -> a
    | a::r -> last r;;

val last : \'a list -> \'a

>last [];;
 last [];;
 ^^^^^^^

 stdin(8,1): error FS0030: Restriction de valeur....

>last ([]:int list);;

System.Exception: Empty list
   à FSI_0002.last[a](FSharpList`1 l)
   à <StartupCode$FSI_0003>.$FSI_0003.main@()
Arrêt en raison d\'une erreur
我该怎么做才能将空列表作为参数传递而不会触发值限制错误?     

解决方法

        我认为您将必须在空列表上(如您所愿)或在对last的调用结果上添加类型注释:
(last [] : int)
。     ,        你可以做
last<obj> []
但是fsi会给您打耳光的感觉,因为最后永远不会显式声明它的type参数。