消除值限制错误 在OCaml中 目标Caml版本3.11.0 #让记录最后一次= 匹配 []->failwith(“空列表”) |a::[]->a |a::r->last r;; val last:'列表->'a= #最后[];; 异常:失败“空列表”。 在F# >让rec last l= 匹配 []->failwith(“空列表”) |a::[]->a |a::r->last r;; val last:“列表->”a >最后[];; 最后[];; ^^^^^^^ 标准输入(8,1):错误FS0030:限制值。。。。 >最后([]:int list);; 系统异常:空列表 最后[a](FSharpList`1l) $FSI_0003.main@() 存在的理由
我该怎么做才能在不触发值限制错误的情况下将空列表作为参数传递?我认为您必须在空列表(如您所做)或调用last:消除值限制错误 在OCaml中 目标Caml版本3.11.0 #让记录最后一次= 匹配 []->failwith(“空列表”) |a::[]->a |a::r->last r;; val last:'列表->'a= #最后[];; 异常:失败“空列表”。 在F# >让rec last l= 匹配 []->failwith(“空列表”) |a::[]->a |a::r->last r;; val last:“列表->”a >最后[];; 最后[];; ^^^^^^^ 标准输入(8,1):错误FS0030:限制值。。。。 >最后([]:int list);; 系统异常:空列表 最后[a](FSharpList`1l) $FSI_0003.main@() 存在的理由,f#,ocaml,value-restriction,F#,Ocaml,Value Restriction,我该怎么做才能在不触发值限制错误的情况下将空列表作为参数传递?我认为您必须在空列表(如您所做)或调用last:(last[]:int)的结果的某个位置放置类型注释。您可以这样做 last<obj> [] last[] 但是fsi会给你一记耳光,因为last从未明确声明它的类型参数。@Johan-想象一下,你的第一个案例返回了未选中的.defaultof,而不是抛出异常。那么在解释器中,last[]会给您带来什么呢?它会带来另一种类型的异常?只是猜测而已。在我写这篇文章的时候(20
(last[]:int)的结果的某个位置放置类型注释。您可以这样做
last<obj> []
last[]
但是fsi会给你一记耳光,因为last从未明确声明它的类型参数。@Johan-想象一下,你的第一个案例返回了未选中的.defaultof
,而不是抛出异常。那么在解释器中,last[]
会给您带来什么呢?它会带来另一种类型的异常?只是猜测而已。在我写这篇文章的时候(2011-06-16),似乎没有更好的方法了。可能也看到了
>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<obj> []