2012-04-12 18 views
6

Estoy tratando de entender las uniones discriminadas y los tipos de registros; específicamente cómo combinarlos para una máxima legibilidad. Aquí hay un ejemplo: digamos que un equipo deportivo puede tener puntos (puntos de liga y diferencia de goles) o puede ser suspendido de la liga, en cuyo caso no tiene puntos ni diferencia de goles. Así es como he intentado expresar que:Combinación de sindicatos discriminados con tipos de registros

type Points = { LeaguePoints : int; GoalDifference : int } 

type TeamState = 
    | CurrentPoints of Points 
    | Suspended 

type Team = { Name : string; State : TeamState } 

let points = { LeaguePoints = 20; GoalDifference = 3 } 

let portsmouth = { Name = "Portsmouth"; State = points } 

El problema se produce al final de la última línea, donde digo "estado = puntos. Me aparece 'Se esperaba que Expression tuviera el tipo TeamState, pero aquí tiene Type Points'. ¿Cómo puedo evitar eso?

Respuesta

5
let portsmouth = { Name = "Portsmouth"; State = CurrentPoints points } 
+0

Usted belleza! Gracias almohadilla. – Kit

+0

(Se marcará como respuesta cuando se permita - 6 minutos!) – Kit

15

Para añadir algunos detalles a la respuesta de la almohadilla, por lo cual su versión inicial no funcionó es que el tipo de valor que se asigna a State debe ser un valor unión discriminada de tipo TeamState. En su expresión:

let portsmouth = { Name = "Portsmouth"; State = points } 

... el tipo de points es Points. En la versión publicada por el pad, la expresión CurrentPoints points utiliza un constructor de TeamState para crear un valor de unión discriminado que representa CurrentPoints. La otra opción que la unión le da es Suspended, que puede ser utilizado como esto:

let portsmouth = { Name = "Portsmouth"; State = CurrentPoints points } 
let portsmouth = { Name = "Portsmouth"; State = Suspended } 

Si no ha utilizado el nombre del constructor, a continuación, no está claro cómo le gustaría construir un equipo suspendido!

Por último, también se puede escribir todo en una única línea, pero eso no es tan legible:

let portsmouth = 
    { Name = "Portsmouth" 
    State = CurrentPoints { LeaguePoints = 20; GoalDifference = 3 } } 
+1

Gracias por la elaboración Tomás :-) – Kit

Cuestiones relacionadas