Я упаковал все семейство данных в один экзистенциал:
data Type = Numeric | Boolean
data family Operator (t :: Type)
data instance Operator 'Numeric = Add | Sub
data instance Operator 'Boolean = And | Or
data AnyOp where
AnyOp :: Operator t -> AnyOp
Теперь я хотел бы сделать на нем сопоставление с образцом.
pp :: AnyOp -> String
pp op = case op of
AnyOp Add -> "+"
AnyOp Sub -> "-"
AnyOp And -> "&"
AnyOp Or -> "|"
Но типчекер кричит на меня, потому что
‘t’ is a rigid type variable bound by a pattern with constructor: AnyOp :: forall (t :: TType). Operator t -> AnyOp, in a case alternative at somesource/somefile/someposition Expected type: Operator t Actual type: Operator 'Boolean ```
Почему? Каков правильный способ сделать это?
data AnyOp where AnyOp :: SType t -> Operator t -> AnyOp
иdata SType t where SNumeric :: SType 'Numeric ; SBoolean :: STYpe 'Boolean
. Вы должны найти много примеров синглетонов в Haskell GADT при их поиске. - person chi   schedule 28.10.2019