F# 构造类型语法是否特殊?

Ada*_*dam 3 syntax f#

我对 F# 的“构造类型”语法很好奇。它被记录在这里

类型参数 通用类型名称

或者

通用类型名称

通过以下示例:

int option

string list

int ref

option<int>

list<string>

ref<int>

Dictionary<int, string>

我很好奇“向后”语法是否有什么特别之处,即参数位于类型之前,或者它是否只是具有一个参数的泛型类型的糖。以下内容有效:

type 'a MyOption = // MyOption<'a> also works
  | MySome of 'a 
  | MyNone
Run Code Online (Sandbox Code Playgroud)

但我无法让它与多个类型参数一起使用。为什么 F# 开发人员更喜欢这种带有一个参数的类型语法?是否有可能或需要让它与两个人一起工作?

bri*_*rns 6

向后语法是OCaml 的遗产。就我个人而言,我从不使用它。如果您确实愿意,可以使其与多个类型参数一起使用,如下所示:

type MyMap = (int, string) Map
Run Code Online (Sandbox Code Playgroud)

但是,这会生成一个尖锐的警告(可能很快就会变成错误):

此构造是为了 ML 兼容性。F# 代码中不使用语法“(typ,...,typ) ident”。考虑使用 'ident<typ,...,typ>' 代替。您可以使用“--mlcompatibility”或“--nowarn:62”禁用此警告。

最重要的是,我建议始终使用 .NET 语法:而MyOption<'a>不是'a MyOption.

  • “底线是,我建议始终使用 .NET 语法”。有[风格指南](https://learn.microsoft.com/en-us/dotnet/fsharp/style-guide/formatting#for-types-prefer-prefix-syntax-for-generics-foot-with-some-特定例外)建议对“选项”和“列表”使用后缀形式,我发现它更具可读性 (3认同)
  • 是的,我已经看到了,但我发现它不一致并且可能令人困惑。当然,这是个人选择,因此如果您喜欢的话,“选项”和“列表”就可以了。 (2认同)