【问题标题】:What does "^" mean when it's in front of a type?类型前面的“^”是什么意思?
【发布时间】:2016-01-11 13:41:38
【问题描述】:

类型前面的“^”是什么意思?

例子:

int : ^T -> int

字符串 : ^T -> 字符串

【问题讨论】:

  • 这是你不能忽视和需要注意的事情之一,但既然你知道了,就不要特意去使用它。如果您理解并需要它,请使用它。大多数时候我使用它是在类型推断告诉我需要它时,然后我故意使用^ 添加类型声明,这样它就很明显了。这是个人喜好,不是标准。
  • 感谢 Guy Coder。这东西简直让我头疼。
  • 我建议您更改您的第一个实际项目,但您正在取得进展并提出有意义的问题。我的第一个大型个人项目是将代码从 OCaml 转换为 F#,这意味着我只需要关注 OCaml 和 F# 之间的差异,这比 C# 和 F# 之间的差异要少得多。
  • 如您所见,类型推断是 ML 语言家族的重要组成部分,理解它是使用它们的关键。他们为 F# 修改类型推断以适应 .NET 的方式并没有让它变得更容易。请参阅 Converting OCaml to F#: Differences between typing and type inference 以获取希望对您有所帮助的类型推断信息的链接。

标签: f#


【解决方案1】:

这表示Statically Resolved Type Parameter

来自 MSDN:

静态解析的类型参数是一个类型参数,它是 在编译时而不是在运行时替换为实际类型。 它们前面有一个插入符号 (^)。

所以它与'T 非常相似,但您可以使用它来提供成员约束,并且编译器将在编译时解析它们(显然) - 通常您只使用inline 并且类型推断将起作用适合你 - 但是有一些非常高级的技巧 (for example FsControl) 使用这个(不经常使用的)功能

示例

let inline add a b = a + b

val inline add :
  a: ^a -> b: ^b ->  ^c
    when ( ^a or  ^b) : (static member ( + ) :  ^a *  ^b ->  ^c)

将添加这样一个约束以表明这将适用于所有数字类型(它将向静态运算符添加成员约束(+)

【讨论】:

  • AFAIK,静态解析的类型参数适用于内联函数,具有讽刺意味的是,它们在示例中不可见。
  • 您对第一个是正确的(也许我应该说得更清楚)-但它们(在示例中)是可见的-您可以自己声明它们(但这有点乱- 你必须使用与那里相同的语法)
  • 这真的没那么糟糕——它只是告诉编译器它应该寻找类型 a bc 以便 ab 有一个名为( + ) 用给定的签名,然后替换 (inline) 调用 - 在现实生活中,这将是单一类型上的加法运算符,如 intdouble(其中 a = b = c) - 所以而不是 @ 987654337@ 编译器将只产生4 + 5 和来自int+
  • @ScottNimrod 如果您考虑一个加法函数,它可以适用于很多类型:浮点数、双精度数、整数等。这种注释告诉编译器,请验证我们给出的任何参数我们的函数有一些关于它的特殊属性(在这种情况下是一个重载的+ 运算符)。它有特殊的属性,它总是可以使函数工作,否则是编译器错误。
  • @TheInnerLight AFAIK 编译器将生成非通用代码并将调用替换为 - 约束用于查找具体实现
猜你喜欢
  • 2018-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多