为什么“代码不够通用”?

时间:2010-07-09 09:09:05

标签: generics f# inline type-inference

任何人都可以解释为什么下面的第二个例子不能编译?

'测试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)

2 个答案:

答案 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的情况下,我们知道我们想要内联objobj,这样就可以了。

答案 1 :(得分:0)

我想是因为字符串有(obj - &gt;字符串)的签名所以使用字符串本身就强制a为obj类型。 (F#不进行隐式演员表。)