Я хотел бы выразить Constraint
по типам типа k -> k -> Type
, что может быть сформулировано на английском языке как:
Тип
s
такой, что для всехx
x'
,y
иy'
, гдеCoercible x x'
иCoercible y y'
,Coercible (s x y) (s x' y')
Или на еще более простом английском языке:
Тип
s
, который всегда является принудительным, если два его параметра являются принудительными.
Последний кажется уже мучительно близким к haskell, и у меня есть код, который действительно выглядит так, как будто он должен это делать:
type Representational2 (s :: k -> k -> Type) =
forall x x' y y'. (Coercible x x', Coercible y y') => Coercible (s x y) (s x' y')
Однако это не работает, ghc хочет, чтобы Coercible (s x y) (s x' y')
был типом, но это Constraint
(включены ConstraintKinds
и QuantifiedConstraints
).
• Expected a type, but
‘Coercible (s x y) (s x' y')’ has kind
‘Constraint’
• In the type ‘forall x x' y y'.
(Coercible x x', Coercible y y') => Coercible (s x y) (s x' y')’
In the type declaration for ‘Representational2’
Я не совсем понимаю, что происходит, но я понимаю, что ghc не нравится, когда Constraint
находится справа от =>
внутри type
. Так как я могу создавать псевдонимы типов с Constraint
видами и я могу создавать псевдонимы type
с =>
, проблем нет.
В чем проблема и как я могу выразить это ограничение для ghc приемлемым для него образом?