Я работаю над созданием своего собственного симулятора Diplomacy на Haskell, чтобы намочить ноги. .
Я считаю, что придумал достойное определение того, что такое заказ:
data Order = Hold Unit Territory
| Move Unit Territory Territory
| Support Unit Territory Unit Territory Territory
| Convoy Fleet Territory Army Territory Territory
deriving (Eq, Show)
Для тех, кто не знаком с игрой, приказы написаны в форме «Держать флот в Лондоне», «Перемещать флот в Лондон, Ла-Манш», «Поддерживать флот, флот, Ла-Манш, Северная Атлантика, середина Атлантического океана» или «Конвойный флот, армия Ла-Манша». Лондон Брест» и др.
Теперь, с определением Единицы как data Unit = Fleet | Army (deriving Eq, Show)
, я получаю сообщение об ошибке Not in scope: type constructor or class 'Fleet'
в отношении моего определения Порядка.
Почему это?
Как я могу написать свои определения для Отрядов или Приказов (или мне следует сделать что-то другое), что позволит мне требовать, чтобы первым аргументом Конвоя был Флот, а третьим аргументом была Армия?
Я просто «даже не ошибся» в своем подходе к этой проблеме?
Должен ли я подойти к этому в моей функции проверки (потому что, насколько мне известно, нет СПОСОБНОСТИ указать только действительные заказы через Haskell. Это выразительно, но не НАСТОЛЬКО выразительно)?
Я уже пытался использовать «DataKinds», но это мне совсем не помогло (несмотря на постскриптум об ошибке, предлагающий сделать это, опять же, постскриптумы об ошибках Haskell предлагают много вещей, поэтому я сомневаюсь, что мне нужно уделять слишком много внимания Это).
Fleet
не является типом, это конструктор типаUnit
. Я думаю, вам стоит немного переосмыслить свой дизайн. Кроме того,DataKinds
определенно не то, что вам нужно. Это расширенная функция, которая здесь не применяется. - person pdexter   schedule 01.08.2016