несмотря на название, я не собираюсь спрашивать о простом переводе между миром OO и Haskell, но я не могу найти лучшего названия. Это обсуждение аналогично, но не равно этому .
Я начал игрушечный проект, чтобы расширить свои ограниченные знания Хаскелла, читая «Учим Хаскелла для великого блага», и я решил внедрить очень простую «Элементарную систему типов», которая является Подмножество типичной системы сражений в играх, таких как Final Fantasy и Simila.
Я пропускаю большинство деталей, но это в двух словах моя проблема:
Я хочу смоделировать заклинание, магию, которую вы можете наложить на игрока или на монстра. В мире ОО вы обычно выбираете интерфейс «Castable» с методом «onCast (Player)», класс «Spell», чтобы вы могли определить что-то вроде этого
Spell myNewSpell = Spell("Fire", 100, 20);
myNewSpell.onCast(Player p); //models the behaviour for the Fire spell
В Haskell я думал об этом с точки зрения типов и классов (я знаю, что классы в Haskell - это другое понятие!). Я столкнулся с некоторыми трудностями, потому что моей первой попыткой было создать это:
--A type synonim, a tuple (HP,MP)
type CastResult = (Integer,Integer)
--A castable spell can either deal damage (or restore) or
--inflict a status
class Castable s where
onCast :: s -> Either (Maybe Status) CastResult
data Spell = Spell{spellName :: String,
spellCost :: Integer,
spellHpDmg :: Integer,
spellMpDmg :: Integer,
spellElem :: Maybe Element} deriving (Eq,Show,Read)
Теперь предположим, что я создал какое-то заклинание с использованием синтаксиса записи
bio = Spell{spellName = "Bio", ...etc..}
Я хотел бы иметь возможность сделать что-то вроде этого
instance Castable bio where
onCast bio = Left (Just Poison)
Здесь много проблем:
1) Я не могу сделать "Castable bio", так как bio должен быть конкретным типом, а не значением типа (это должно быть Castable Spell)
2) био не находится в области видимости, внутри блока экземпляра это просто значение для сопоставления с шаблоном
В целом, я чувствую, что этот выбор дизайна довольно скудный, но я все еще учусь и не понимаю такие сложные темы, как Functors, просто чтобы назвать одну.
В двух словах, какой идиоматический способ справиться с подобной ситуацией? Я имею в виду ситуацию, которая требует «одного определения, множественной реализации для нескольких экземпляров», просто чтобы использовать терминологию ОО.
Спасибо всем, счастливого кодирования,
Alfredo