F# 编译器错误 FS0030,值限制问题

Posted

技术标签:

【中文标题】F# 编译器错误 FS0030,值限制问题【英文标题】:F# compiler error FS0030, problems with the Value Restriction 【发布时间】:2010-09-29 19:29:59 【问题描述】:

我已阅读 StrangeLights 的简介,已阅读 Expert F# 的 passage(第 119 页),但我看不出它们如何应用于我的代码:

对于我的测试,我想检查浮点数之间的相等性,并有一点宽容。我正在将所有内容都转换为度量单位,但我希望能够成为“通用”:

let toleq (e:float<_>) a b = (abs ( a - b ) ) < e

然后我可以使用它来检查不同“类型”浮点数的相等性,或者对它进行咖喱制作自定义:

toleqm = toleq 1.0e-10<m>

但我收到以下消息:

Type inference has inferred the signature
    val toleq : float<'u> -> float<'u> -> float<'u> -> bool
Either define 'toleq' as a simple data term, make it a function, or add a 
    type constraint to instantiate the type parameters.

我不知道如何才能使它成为一个函数 - 我看不到任何隐式参数。

怎么了?

【问题讨论】:

我无法在 1.9.6.2 上重现该错误消息,您能展示生成它的整个小程序吗? 没有小程序,只是在 FSI 中尝试过,单行给我的错误。 交叉引用同一主题的另一个问题:***.com/questions/1131456/… 【参考方案1】:

好吧,我搞砸了一点,绝望地找到了解决方案,但我不确定我是否理解为什么......

let toleq (e:float<_>) (a:float<_>) (b:float<_>) = (abs ( a - b ) ) < e

呃,它几乎和 C# 中的泛型声明一样难看。

【讨论】:

以上是关于F# 编译器错误 FS0030,值限制问题的主要内容,如果未能解决你的问题,请参考以下文章

F#签名文件错误

值限制错误详情

定义平方和而不定义参数

hashedmap和指向结构的指针:CXX0030:错误:无法计算表达式

无法在 F# 中使用 let 关键字定义递归方法

编译原理 #05# Nonrecursive Predictive Parsing