F#后缀关键字用于类型

6
据我所知,F#语言中的Option和List类型有一种特殊的表示法。例如,Option<'a>'a option相同,'a listFSharpList<'a>相同。
这些是特定的语言关键字,还是有一种方式可以定义自定义类型,以便像listoption一样使用“后缀”表示法?

1
我看到有关于在不同情况下使用哪种语法的建议。不确定我在哪里看到过,但也许其中一个地方是“F# for fun and profit”网站。 - Bent Tranberg
这只是定义类型的两种方式,一种来自OCAML,另一种是.NET的方式。 - s952163
1个回答

7
您可以对任何要定义的 F# 类型执行此操作。您不会获得自动小写版本的名称...但是,F# 内置类型也没有:在 F# 源代码中的 FSharp.Core/prim-types.fs 中,有一个定义 type 'a list = List<'a>,这就是为什么您可以编写 int list 而不是 List<int>
在定义类型时,您可以使用 Foo<'a>'a Foo(或 'a foo)。唯一的规则是必须匹配您定义类型时使用的大小写风格。以下是一个 F# 交互会话以演示:
> type Foo<'a> = 'a list ;;
type Foo<'a> = 'a list

> type 'a bar = 'a list ;;
type 'a bar = 'a list

> let x : int Foo = [] ;;
val x : Foo<int> = []

> let y : Foo<int> = [] ;;
val y : Foo<int> = []

> let z : int bar = [] ;;
val z : int bar = []

> let w : bar<int> = [] ;;
val w : int bar = []

但你必须匹配你定义的类型的大小写:
> let x : int foo = [] ;;

  let x : int foo = [] ;;
  ------------^^^

error FS0039: The type 'foo' is not defined. Maybe you want one of the following:
   Foo
   Foo`1

> let y : Bar<int> = [] ;;

  let y : Bar<int> = [] ;;
  --------^^^

error FS0039: The type 'Bar' is not defined. Maybe you want one of the following:
   bar
   bar`1

请注意,无论我们将类型定义为 int Foo 还是 Foo<int>,在 F# 交互响应中列出的类型都是 Foo<int>。这并不基于我们用来定义类型的大小写(大写或小写),而是基于我们使用的前缀/后缀顺序。
> type foo<'a> = 'a list ;;
type foo<'a> = 'a list

> type 'a bar = 'a list ;;
type 'a bar = 'a list

> let x : 'a foo = [] ;;
val x : foo<'a>

> let y : 'a bar = [] ;;
val y : 'a bar

所以这就是了。你可以在不做任何特殊处理的情况下使用此语法来定义自己的类型。唯一的规则是该类型必须恰好有一个泛型参数:你不能这样写:type d = int,string Dictionary。对于需要两个或更多泛型参数的类型,你必须使用 Dictionary<int,string> 的格式进行定义。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接