摆脱价值限制错误

时间:2011-06-15 13:41:52

标签: f# ocaml value-restriction

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

如果能够在不触发值限制错误的情况下将空列表作为参数传递,我该怎么做?

2 个答案:

答案 0 :(得分:1)

我认为你必须在某个地方放置一个类型注释,或者在空列表中(如你所知)或者在最后一次调用的结果:(last [] : int)

答案 1 :(得分:0)

你可以做到

last<obj> []

但是fsi会给你一个耳光,因为上次从未明确声明它的类型参数。