任何人都可以解释为什么下面的第二个例子不能编译?
'测试2'给出了“错误FS0670:此代码不够通用。类型变量^ a无法推广,因为它会逃避其范围。”我无法理解此错误消息。
// Test 1
type test1<'a> = | A of 'a
with
override t.ToString() =
match t with
| A a -> a.ToString()
// Test 2
type test2<'a> = | A of 'a
with
override t.ToString() =
match t with
| A a -> string a
// Test 3
type test3<'a> = | A of 'a
with
override t.ToString() =
match t with
| A a -> string (a :> obj)
答案 0 :(得分:5)
这是另一个复制品:
let inline f< ^T>(x:^T) = box x
type test4<'a> = | A of 'a
with
member t.M() =
match t with
| A a -> f a
string
是一个使用静态类型约束的内联函数,这些函数的错误诊断有时很差。我真的不了解诊断消息本身,但重点是,在调用站点,我们不知道泛型类型'a
,这意味着我们无法内联调用{的正确版本{1}}(或我的复制品中的string
)。在例如在您转发到f
的情况下,我们知道我们想要内联obj
版obj
,这样就可以了。
答案 1 :(得分:0)
我想是因为字符串有(obj - &gt;字符串)的签名所以使用字符串本身就强制a为obj类型。 (F#不进行隐式演员表。)