Mark Pattison
Mark Pattison

Reputation: 3039

Are F# record types implemented as structs or classes?

I'm using record types in F# to store some simple data, e.g. as follows:

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 }

I can't work out whether this will be implemented as a value or reference type.

I've tried putting [<Struct>] before the type definition but this causes all sorts of compile errors.

Upvotes: 5

Views: 1692

Answers (3)

Ramon Snir
Ramon Snir

Reputation: 7560

Records are classes, but all fields are immutable by default. In order to use the "advantage" of reference types, you must set the fields as mutable (you can set some as immutable and some as mutable) and then modify their value:

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

Upvotes: 4

Jack Lloyd
Jack Lloyd

Reputation: 8405

[<Struct>] is the correct syntax for requesting a value type. It can be seen used in Chapter 6 of 'Expert F#', and this is accepted by F# 2.0:

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

Though if you write it as [<Struct>] type Point = (ie all on one line) it produces a number of warnings (no errors, though). Which version of F# are you using?

Upvotes: 9

James Black
James Black

Reputation: 41838

According to this wikipedia article, http://en.wikipedia.org/wiki/F_Sharp_(programming_language), record types are implemented as classes with properties defined.

Upvotes: 2

Related Questions