代码之家  ›  专栏  ›  技术社区  ›  Joan Venge

自定义f类型如何映射到clr类型?

  •  3
  • Joan Venge  · 技术社区  · 14 年前

    我不知道问题的标题是否清楚,但我想知道定制F类型的实际类型。

    与C中一样,有值类型和引用类型。对于F,是否有单一类型控制类型系统?

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

    或者是否有完全不同于值/引用类型的新类型?

    任何信息都会有帮助。

    4 回复  |  直到 14 年前
        1
  •  12
  •   Tomas Petricek    14 年前

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

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

    [<Struct>]
    type ValueType(a:int) =
       member x.A = a
    
    type Enumeration = 
      | First = 1
      | Second = 2
    

    其余的f类型是特定于f_的,在clr中没有任何标准表示。F编译器将它们编码为一个类(或多个类)。

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

    • 函数值 使用泛型表示 FSharpFunc<...> 类型。这使得F_可以实现当前和部分功能应用程序,因此这有点棘手。例如, int -> int -> int 会是 FSharpFunc<int, FSharpFunc<int, int>> . 类型有一个 Invoke 方法,可以使用第一个参数调用它。f还生成一个派生类型,该派生类型包含 援引 方法取所有参数,效率更高,且大部分时间都在使用。

    • 歧视工会 表示为具有抽象基类(与联合类型同名)和每个事例的子类的类层次结构。例如:

      type Shape = 
        | Rectangle of int * int * int * int
        | Circle of int * int * int 
      

      这将创建一个抽象基类 Shape 以及两个派生的混凝土类 Rectangle Circle (实际上,在 形状 类)。这些派生类将包含存储案例属性所需的字段(例如矩形的位置)。

    如果你想了解更多,你可以看看 Adventures in F# series 作者:Jomo Fisher。

        2
  •  3
  •   Henk Holterman    14 年前

    ECMA 335(cli),§8.5.2被称为: 值类型和引用类型

    它们不是C(唯一)概念。

        3
  •  2
  •   Lou Franco    14 年前

    值和引用类型来自.NET,而不是C。不是F方面的专家,但我必须相信它们的类型是相同的,因为它是一流的.NET语言,并且吹捧与C的互操作性。

    此外,引用类型可以是不可变的(例如字符串),值类型可以是可变的 (几乎所有的.NET都是如此) --这些与可变/不变的选择无关。

    编辑:根据注释更正。

        4
  •  1
  •   BrokenGlass    14 年前

    您在f中也有接口、类和结构-这些映射与其他clr语言(如c)的预期一致,因此出于接口目的,您应该将自己限制为这些类型。

    至于受歧视的联合和记录,映射就更复杂了,如果不一定非得这么做,就不必这么做。

    推荐文章