2009-05-11 14 views
6

He revisado mis libros y he buscado en Google hasta que me he quedado sin términos de búsqueda, pero todavía no encuentro un ejemplo o respuesta a este problema:¿Cómo se resuelven los errores de referencia tipo F #?

El siguiente código no se compila porque el tipo Efecto y el tipo Afecto no se han declarado en el momento en que se declara Entidad. Entonces, lo que no entiendo es cómo solucionar esto.

En C++, este problema se resuelve a través de una declaración de prototipo en h archivos y luego incluye el archivo h. En C# nunca es un problema. Entonces, ¿cómo se resuelve en F #?

#light 
type Entity = 
    { 
     Name:string; 
     Affects:List<Affect>; //Compile error: The type Affect is not defined 
     Effects:List<Effect>; //Compile error: the type Effect is not defined 
    } 

type Effect = 
    { 
     Name:string; 
     //A function pointer for a method that takes an Entity and returns an Entity 
     ApplyEffect:Entity -> Entity; 
    } 

type Affect = 
    { 
     Name:string; 
     //A List of Effects that are applied by this Affect Object 
     EffectList:List<Effect>; 
     //A function pointer to return an Entity modified by the listed Effects 
     ApplyAffect:Entity->Entity; 
    } 

El objetivo subyacente aquí es que un objeto del tipo de entidad debe ser capaz de enumerar los afectos se puede aplicar a objetos de tipo de entidad. La entidad también puede enumerar los Efectos que se le han aplicado. De esta forma, el estado "actual" de una entidad se encuentra plegando todos los Efectos contra el estado de la entidad original.

Gracias por su tiempo,

--Adam Lenda

+0

Ver también http://stackoverflow.com/questions/680606/f-how-to-have-two-methods-calling-each-other wh Ich muestra cómo definir funciones mutuamente recursivas, así como tipos mutuamente recursivos. – Brian

Respuesta

13

Creo que esta es la respuesta correcta:

http://langexplr.blogspot.com/2008/02/defining-mutually-recursive-classes-in.html

así que ...

type Entity = 
    { 
     Name:string; 
     Affects:List<Affect>; 
     Effects:List<Effect>; 
    } 
and Effect = 
    { 
     Name:string; 
     ApplyEffect:Entity -> Entity; 
    } 
and Affect = 
    { 
     Name:string; 
     EffectList:List<Effect>; 
     ApplyAffect:Entity->Entity; 
    } 
+0

Sí, eso es justo lo que estaba a punto de publicar, ahora que lo había encontrado. Capítulo 8 en "Programación funcional para el mundo real" :) –

+0

capítulo 3, página 67 de 'experto f #' –

+0

Hrmm ... Estaba a punto de publicar lo mismo, pero concluí que no era posible después de obtener un error de compilación ! Resulta que acabo de obtener la sintaxis un poco mal. – Noldorin

Cuestiones relacionadas