несмотря на название, я не собираюсь спрашивать про простой перевод между OO-миром и Haskell, но я не могу понять лучшего названия. Это обсуждение похоже, но не равно, этому.
Я начал игрушечный проект только для того, чтобы расширить свои ограниченные знания о Haskell, читая "Learn You a Haskell for Great Good", и я решил реализовать очень базовую "Систему элементов элемента", которая является подмножество типичной боевой системы в таких играх, как Final Fantasy et simila. Я пропускаю большинство деталей, но это в двух словах моя проблема:
Я хочу смоделировать заклинание, магию, которую вы можете наложить на игрока или на монстра. В мире OO вы обычно идете для интерфейса "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", поскольку био должен быть конкретным типом, а не значением типа (это должно быть заклинание Castable)
2) био не находится в области видимости, внутри блока экземпляра видно, что значение соответствует шаблону
В целом, я чувствую, что этот выбор дизайна довольно низок, но я все еще участвую, и я не понимаю такие продвинутые темы, как "Фунтеры", просто чтобы назвать его.
В двух словах, что является идиоматическим способом борьбы с подобной ситуацией? Я имею в виду ситуацию, для которой требуется "одно определение, множественная реализация для нескольких экземпляров", просто для использования терминологии OO.
Спасибо всем, счастливое кодирование,
Alfredo