Для типов Door
и Hallway
:
data DoorState :: Type where
Opened :: DoorState
Closed :: DoorState
Locked :: DoorState
deriving (Bounded, Enum, Eq, Ord, Show)
data Door :: DoorState -> Type where
Door :: {material :: String} -> Door s
deriving (Show)
data Hallway :: [DoorState] -> Type where
Origin :: Hallway '[]
Section :: Door ds -> Hallway dsl -> Hallway (ds : dsl)
Это определение appendHallway
работает:
appendHallway :: forall (ds :: DoorState) (dsl :: [DoorState]). Door ds -> Hallway dsl -> Hallway (ds : dsl)
appendHallway d rest = Section d rest
Однако это определение для appendHallway
, где отношениемежду ds
и dsl
явно указывается в разделе forall
, не работает:
appendHallway :: forall t (ds :: t) (dsl :: [t]). (t ~ DoorState) => Door ds -> Hallway dsl -> Hallway (ds : dsl)
appendHallway d rest = Section d rest
Возвращается следующая ошибка:
error:
• Expected kind ‘DoorState’, but ‘ds’ has kind ‘t’
• In the first argument of ‘Door’, namely ‘ds’
In the type signature:
appendHallway :: forall t (ds :: t) (dsl :: [t]).
(t ~ DoorState) => Door ds -> Hallway dsl -> Hallway (ds : dsl)
|
351 | appendHallway :: forall t (ds :: t) (dsl :: [t]). (t ~ DoorState) => Door ds -> Hallway dsl -> Hallway (ds : dsl)
| ^^
приведенный выше пример может быть немного надуманным, но могут быть ситуации, когда указание отношений между переменными типа с более высоким родом будет полезным или даже необходимым.Является ли эта ошибка ограничением текущей версии GHC или вышеупомянутое бессмысленно даже в будущей версии GHC?Есть ли другой способ выразить отношения между ds
и dsl
, которые были бы приняты GHC?