【发布时间】:2012-06-08 19:43:17
【问题描述】:
我有一个带有一个通用参数的基本函数:
let func<'T> (x:'T when 'T : (static member op_Explicit: 'T -> float) ) =
float x
为什么我会收到错误:“声明的类型参数 'T 不能在此处使用,因为类型参数无法在编译时解析”
在这个例子中,我提供了一个通用参数并限制它能够显式地转换为浮点数,并且所有的函数都被转换为浮点数,那么问题是什么?我已经阅读了所有与 F# 中的泛型相关的 MSDN 文档,但它们似乎只是绕圈子,与我在 Visual Studio 中看到的行为不符。据我了解,使用单引号语法'T 是针对运行时泛型,而不是编译时泛型。
这让我想到了另一个问题。我经常看到'T 和^T 混合在一起的语法,无论有没有inline。这与有关这些语法定义的 MSDN 文档背道而驰。我错过了什么吗?
此外,从文档看来,'T 类型的 op_Explicit 约束似乎应该能够在没有任何类型注释的情况下自动推断:
let func x =
float x
但在这种情况下,x 的类型被推断为int。
【问题讨论】:
-
@ildjarn,我已经能够让
inline或“静态解析”参数类型以类似的方式工作,但在这个问题中,我问的是正确的语法标准运行时类型解析。 -
我不明白你在说什么。如果没有
inline,则不能使用静态解析的类型参数。float需要静态解析的类型参数,因此任何要传递给float的函数也需要内联,除非您愿意将使用限制为单一类型。 -
我想我不明白你说“浮点需要静态解析的类型参数”是什么意思。如果我将
x限制为仅具有op_Explicit: 'T -> float的那些类型,那么在运行时或编译时解析确切的类型有什么关系? -
因为该约束(在 F# 术语中)仅可以在编译时进行。 :-] 你可以使用反射来达到同样的效果,但是没有直接的语法,而且性能也不会很好。
-
我明白你现在在说什么,我已经添加了一个答案来总结。
标签: generics f# inline type-inference