【问题标题】:Are F# record types implemented as structs or classes?F# 记录类型是作为结构还是类实现的?
【发布时间】:2011-07-07 15:49:27
【问题描述】:

我在 F# 中使用记录类型来存储一些简单的数据,例如如下:

open Vector

type Point =
    {
        x: float;
        y: float;
        z: float;
    }
    static member (+) (p: Point, v: Vector) = { Point.x = p.x + v.x ; y = p.y + v.y ; z = p.z + v.z }
    static member (-) (p: Point, v: Vector) = { Point.x = p.x - v.x ; y = p.y - v.y ; z = p.z - v.z }
    static member (-) (p1: Point, p2: Point) = { Vector.x = p1.x - p2.x ; y = p1.y - p2.y ; z = p1.z - p2.z }
    member p.ToVector = { Vector.x = p.x ; y = p.y ; z = p.z }

我无法确定这将作为值类型还是引用类型来实现。

我尝试将[<Struct>] 放在类型定义之前,但这会导致各种编译错误。

【问题讨论】:

标签: f# record


【解决方案1】:

[<Struct>] 是请求值类型的正确语法。可以看到在“Expert F#”的第 6 章中使用,并且被 F# 2.0 接受:

[<Struct>]
type Point =
  val x: float
  new(x) = {x=x;}

虽然如果你把它写成[&lt;Struct&gt;] type Point =(即全部在一行上),它会产生一些警告(虽然没有错误)。您使用的是哪个版本的 F#?

【讨论】:

  • VS2010 中的 F# 2.0。我想不同的是,在你的代码中它不再是记录类型了?
  • 啊,你是对的。缺少你的Vector 我没有仔细考虑就重写了代码,对不起。
【解决方案2】:

记录是类,但默认情况下所有字段都是不可变的。为了利用引用类型的“优势”,你必须将字段设置为可变(你可以将一些设置为不可变,一些设置为可变),然后修改它们的值:

type Point =
    {
        mutable x : float
        y : float
        z : float
    }
    member p.AddToX Δx = p.x <- p.x + Δx

【讨论】:

    【解决方案3】:

    根据这篇维基百科文章http://en.wikipedia.org/wiki/F_Sharp_(programming_language),记录类型是作为定义了属性的类实现的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-27
      • 2012-08-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-21
      • 2011-06-09
      • 2010-12-22
      相关资源
      最近更新 更多