2009-05-11 4 views
6

Я прошел через свои книги, и у меня есть googled, пока у меня не закончились поисковые запросы, но я до сих пор не могу найти пример или ответ на эту проблему:Как разрешить ссылочные ошибки F # Type?

Следующий код не компилируется потому что тип Effect и тип Affect не были объявлены в момент объявления Entity. Поэтому я не понимаю, как это можно обойти.

В C++ эта проблема решается посредством объявления прототипа в h-файлах, а затем включает h-файл. В C# это никогда не проблема. Итак, как это разрешено в 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; 
    } 

Основная цель здесь состоит в том, что объект типа Entity должен быть в состоянии перечислить Влияет он может применить к объектам типа сущностей. Сущность также может перечислять эффекты, которые были применены к ней. Таким образом, «текущее» состояние объекта обнаруживается путем складывания всех эффектов против исходного состояния объекта.

Спасибо за ваше время,

--Adam Ленда

+0

См также http://stackoverflow.com/questions/680606/f-how-to-have-two-methods-calling-each-other wh ich показывает, как определить взаимно рекурсивные функции, а также взаимно-рекурсивные типы. – Brian

ответ

13

Я считаю, что это правильный ответ:

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

так ...

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

Yup - вот что я собирался публиковать, теперь я нашел его. Глава 8 в «Функциональное программирование для реального мира» :) –

+0

глава 3, стр. 67 из «expert f #» –

+0

Hrmm ... Я собирался опубликовать одно и то же, но пришел к выводу, что это невозможно после получения ошибки компилятора ! Оказывается, я просто получил синтаксис немного неправильно. – Noldorin

Смежные вопросы