2011-07-07 11 views
5

Używam typów rekordów w F # do przechowywania niektórych prostych danych, np. w następujący sposób:Czy typy rekordów F # są zaimplementowane jako struktury lub klasy?

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 } 

Nie mogę pracować, czy będzie to realizowane jako typ wartości lub odniesienia.

Próbowałem wstawiać [<Struct>] przed definicją typu, ale powoduje to wszelkiego rodzaju błędy kompilacji.

+2

Typy rekordów są zawsze typami odniesienia: http://stackoverflow.com/questions/5858550/f-records-vs-net-struct/5858577#5858577 –

Odpowiedz

5

[<Struct>] to poprawna składnia żądania typu wartości. Można zauważyć, stosowany w rozdziale 6 „Expert F #”, a ta jest akceptowana przez F # 2.0:

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

ale jeśli piszesz go jako [<Struct>] type Point = (czyli wszystko w jednej linii) nie produkuje szereg ostrzeżeń (bez błędów). Z której wersji F # korzystasz?

+0

F # 2.0 w VS2010. Chyba różnica jest taka, że ​​w twoim kodzie nie jest to już typ rekordu? –

+0

Ach, masz rację. Pomijając "Wektor" przepisałem kod bez zastanowienia, przepraszam. –

4

Rekordy są klasami, ale wszystkie pola są domyślnie niezmienne. Aby skorzystać z "przewagi" typów odniesienia, należy ustawić zmienne jako zmienne (można ustawić niektóre jako niezmienne, a niektóre jako zmienne), a następnie zmodyfikować ich wartość:

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