自定义F#类型如何映射到CLR类型?

Joa*_*nge 3 c# f# type-systems

我不知道问题的标题是否清楚,但我想知道自定义F#类型的实际类型.

与C#一样,有值类型和引用类型.对于F#,是否存在一种管理类型系统的类型?

它们都是值类型(因为它们默认是不可变的)吗?

或者是否有全新的类型与价值/参考类型无关?

任何信息都会有帮助.

Tom*_*cek 12

F#有各种类型.标准.NET类型(也存在于C#中)(如,接口委托)直接映射到相应的CLR表示.

您还可以使用属性定义值类型Struct(在这种情况下,您将获得与C#对应的类型struct)和类似这样的枚举:

[<Struct>]
type ValueType(a:int) =
   member x.A = a

type Enumeration = 
  | First = 1
  | Second = 2
Run Code Online (Sandbox Code Playgroud)

其余的F#类型特定于F#,并且在CLR中没有任何标准表示.F#编译器将它们编码为一个类(或几个类).

  • Record只是一个具有与记录字段对应的属性的类.
  • 使用泛型Tuple<...>类(.NET 4.0中的新增类)表示元组

  • 函数值使用泛型FSharpFunc<...>类型表示.这允许F#实现currying和部分函数应用程序,因此有点棘手.例如,int -> int -> intFSharpFunc<int, FSharpFunc<int, int>>.该类型有一个Invoke方法,您可以使用该方法使用第一个参数调用它.F#还生成一个派生类型,其中包含Invoke获取所有参数的方法,这种方法更有效并且大部分时间都在使用.

  • 区分联合表示为具有抽象基类(与联合类型同名)的类层次结构,以及每个案例的子类.例如:

    type Shape = 
      | Rectangle of int * int * int * int
      | Circle of int * int * int 
    
    Run Code Online (Sandbox Code Playgroud)

    这将创建一个抽象基类Shape和两个派生的具体类RectangleCircle(实际上,类中的嵌套类Shape).这些派生类将包含存储案例属性所需的字段(例如矩形的位置).

如果你想了解更多,你可以看看Jomo Fisher的F#系列历险记.