【问题标题】:Getting rid of value restriction errors摆脱价值限制错误
【发布时间】:2011-09-15 13:29:45
【问题描述】:

在 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

我应该怎么做才能将空列表作为参数传递而不触发值限制错误?

【问题讨论】:

标签: f# ocaml value-restriction


【解决方案1】:

你可以的

last<obj> []

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

【讨论】:

    【解决方案2】:

    我认为您将不得不在某处放置类型注释,无论是在空列表(如您所拥有)上还是在调用 last 的结果上:(last [] : int)

    【讨论】:

    • @Johan - 想象一下您的第一个案例返回Unchecked.defaultof&lt;_&gt; 而不是抛出异常。那么你希望last [] 在解释器中给你什么?
    • 它会给出另一种类型的异常吗?只是猜测。
    • 在我写这篇文章的时候(2011-06-16)似乎没有更好的办法了。
    猜你喜欢
    • 1970-01-01
    • 2010-12-16
    • 1970-01-01
    • 2020-04-02
    • 1970-01-01
    • 1970-01-01
    • 2014-09-09
    • 2011-08-07
    • 1970-01-01
    相关资源
    最近更新 更多