Я прошел через свои книги, и у меня есть 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 Ленда
См также http://stackoverflow.com/questions/680606/f-how-to-have-two-methods-calling-each-other wh ich показывает, как определить взаимно рекурсивные функции, а также взаимно-рекурсивные типы. – Brian