Реализуются ли типы записей F # как структуры или классы? - PullRequest
5 голосов
/ 07 июля 2011

Я использую типы записей в 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>] перед определением типа, но это вызывает всевозможные ошибки компиляции.

Ответы [ 3 ]

7 голосов
/ 07 июля 2011

[<Struct>] - правильный синтаксис для запроса типа значения.Это можно увидеть в главе 6 «Эксперт F #», и F # 2.0 принимает это:количество предупреждений (без ошибок).Какую версию F # вы используете?

4 голосов
/ 07 июля 2011

Записи являются классами, но все поля являются неизменяемыми по умолчанию. Чтобы использовать «преимущество» ссылочных типов, вы должны установить поля как изменяемые (вы можете установить некоторые как неизменяемые, а некоторые как изменяемые), а затем изменить их значение:

type Point =
    {
        mutable x : float
        y : float
        z : float
    }
    member p.AddToX Δx = p.x <- p.x + Δx
2 голосов
/ 07 июля 2011

Согласно этой статье в Википедии, http://en.wikipedia.org/wiki/F_Sharp_(programming_language), типы записей реализованы как классы с определенными свойствами.

...