В этой игре я хочу иметь классы игроков, уровни игроков и корабли, которые могут иметься по классу и уровню. У вас может быть только один корабль за раз. Я пришел к выводу, что мне нужны семейства datakinds и data.Функциональный банан-путешественник - система корабля
Вот фрагмент того, что у меня есть, а затем мои вопросы.
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE MultiParamTypeClasses}
{-# LANGUAGE ConstraintKinds #-}
data PlayerClass = Pirate | Merchant | SpaceNinja deriving Show
data ShipClass = Tiny | Medium | Large deriving Show
data Merchant = Rookie | Swindler | IndustryCaptain deriving Show
data Pirate = Lubber | Matey | Captain deriving Show
data family PShip (a :: PlayerClass) (b :: ShipClass)
data instance PShip Pirate Tiny = Junk
{ _hull_junk :: Hull
, _bridge_junk :: Bridge
, _cargo_compartment_junk :: CargoCompartment
, _fuel_tank_junk :: Tank
} deriving Show
Я понимаю, что с DataKinds я могу продвигать термины к типам, но все равно использую их в качестве Условий. Я хочу, чтобы класс абстрагировал выполнение операций для PShips. Я хотел бы сдерживать на уровне уровня (PlayerClass), а затем создавать экземпляры для типов с таким типом. Вот фрагмент того, что я пытаюсь сделать, но не могу.
class (PShip a) => Ship a (b :: PlayerClass) where
...
instance Ship (Pirate Tiny) Lubber ...
Имеет ли это смысл? Я на правильном пути, или мне нужно создать резервную копию и переосмыслить эту проблему? Я ясно сформулировал проблему?
Напоминает мне https://lukepalmer.wordpress.com/2010/01/24/haskell-antipattern-existential-typeclass/. – Zeta
Я думаю о https://www.fpcomplete.com/school/to-infinity-and-beyond/pick-of-the-week/type-families-and-pokemon;) – Carsten
Зета: Я подозревал, что я был старше -engineering. Как вы думаете, я мог бы лучше использовать записи и функции? –