为什么 F# 要求在显式泛型类型参数中使用引号?

Why does F# require quotes in explicit generic type parameters?

提问人:citykid 提问时间:11/7/2023 最后编辑:citykid 更新时间:11/7/2023 访问量:106

问:

显式类型参数必须在字母前用 ' 指定:

type MyType<'t>() = ...
let f<'t> (x: 't) = ...

为什么普通字母像

let f<t> (x: t) = ...
let f<T> (x: T) = ...

不允许?

问题只是关于如何指定显式类型参数。

泛型 F#

评论

0赞 Panagiotis Kanavos 11/7/2023
这些例子不如说明为什么使用的例子常见,或者只是说明为什么使用。通常不需要类型注释,除非 F# 的类型推理无法使函数泛型。我怀疑真正的问题应该是为什么在常见情况下允许let f(x: 't)=xlet f(x)=x't<'t>(x: 't)(x: 't)
6赞 ildjarn 11/7/2023
F# 的语法主要来自 OCaml,这就是 OCaml 的工作方式。就这么简单。
2赞 Panagiotis Kanavos 11/7/2023
F# 在 .NET 和 C# 之前就有了泛型,所以这不是为什么不到处使用,而是为什么它甚至被允许。F# 始终用于泛型。 是一个特例<>'t<>
2赞 JL0PD 11/8/2023
我想这是因为函数很少具有完整的类型签名,并且只有一些参数被注释。如果没有引号,就可以写,编译器必须找到类型,如果找不到,则将其视为泛型参数。这将打开难以识别的新错误类别。允许在不加引号的情况下编写显式泛型参数只会允许以其他方式做同样的事情,这通常是语言创建者避免的let f (x: a) = xaa
1赞 JL0PD 11/8/2023
@citykid,你是对的,但在 F# 中,可以使用泛型参数而无需先声明它:let f (x: 'a) = x

答: 暂无答案