2013-05-01 56 views
3

非常简单的例子:如何检查函数的类型参数是否静态解析?

  1. let myfun x = x
    在这里,在智能感知它说: “X: 'A - >' 了”。在FSI中,它表示“x:'a - >'a”
  2. let inline myfun x = x
    在智能识别系统中,它表示“x:'a - >'a”。在FSI中它说“x:'a - >'a”< < < <为什么不是^a
  3. let inline myfun (x: 'b) = x
    这里在intellisense中说“x:'b - >'b”。在FSI中,它表示“x:'b - >'b”
  4. let inline myfun (x: ^b) = x
    在智能识别系统中,它表示“x:'b - >'b”。在它说,FSI “X:^ B - >^B” < < < <不同

由于智能感知从未显示^b,我应该找^b作为在FSI “静态解析” 的指标?

inline确保“静态解决”?

+0

是的,它的确如此。这就是它的工作原理。 – 2013-05-02 06:20:29

回答

1

内联确实允许但不强制静态解析类型,这就是为什么在案例2中它仍然与案例1中一样。 我认为在大多数情况下,类型推理非常聪明,可以猜测类型是否应该是静态的解决,即使你没有指定^

例如,如果你的函数体改为sqrt x的情况下3.你会得到

> let inline myfun (x: 'b) = sqrt x;; 
val inline myfun : ^b -> ^a when ^b : (static member Sqrt : ^b -> ^a) 

我个人一直尽量不要在第一次尝试明确指定类型,那么我检查,如果我很高兴推断,如果我不是那么我尝试添加内联,但不是帽子类型。

为什么intellisense有时显示不同的东西?这可能是一个小错误。

+0

我认为值得注意的是,在大多数情况下,放置'^'不会传达任何附加信息,因为参数约束只能在静态解析的类型参数上进行。唯一的例外是我可以想到的情况是你明确指出参数具有静态解析类型。 – mydogisbox 2013-05-02 13:07:09

相关问题