2011-07-07 8 views
5

Estoy usando tipos de registro en F # para almacenar algunos datos simples, p. de la siguiente manera:¿Se implementan los tipos de registros F # como estructuras o clases?

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 } 

No puedo determinar si esto se implementará como un valor o tipo de referencia.

He intentado poner [<Struct>] antes de la definición del tipo, pero esto causa todo tipo de errores de compilación.

+2

Los tipos de registro son siempre hacen referencia a tipos: http://stackoverflow.com/questions/5858550/f-records-vs-net-struct/5858577#5858577 –

Respuesta

5

[<Struct>] es la sintaxis correcta para solicitar un tipo de valor. Se puede observar utilizado en el Capítulo 6 de 'Experto F #', y esto es aceptado por F # 2.0:

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

Aunque si se escribe como [<Struct>] type Point = (es decir, todo en una línea) que produce una serie de advertencias (sin errores, sin embargo). ¿Qué versión de F # estás usando?

+0

F # 2.0 en VS2010. Supongo que la diferencia es que en tu código ya no es un tipo de registro. –

+0

Ah, tienes razón. Al carecer de su 'Vector' reescribí el código sin pensar demasiado, lo siento. –

4

Los registros son clases, pero todos los campos son inmutables por defecto. Con el fin de utilizar la "ventaja" de los tipos de referencia, debe configurar los campos como mutable (Se puede fijar algunos como inmutable y algunos como mutable) y modifique su valor:

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