Skip to content

Coercible should be higher-kinded

Just discussed with SJP: The Coercible should be higher kinded, and it seems to be straight forward.

Given

data T f = T (f Int)
newtype List a = [a]

we want to be able to derive

Coercible (T (Either Int)) (T (Either Age))
Coercible (T List) (T [])

We now allow Coercible at a kind * -> k, with the following intuition:

  Coercible A B ⇐⇒ (forall a. Coercible (A a) (B a))

Note that this is ok independent of the role of A’s parameter, as we are not modifying that parameter here.

Allowing such constraints, we therefore, we need these constraints exist in theory (but are in fact generated on demand, so only those of the rind kindnessare visible to the constraint solver) for Either and List:

instance (Coercible a b, Coercible c d)
                           => Coercible (Either a c) (Either b d) -- old
instance Coercible a   b =>   Coercible (Either a) (Either b)     -- new
instance Coercible [a] b =>   Coercible (List a)   b              -- old
instance Coercible b   [a] => Coercible b          (List a)       -- old
instance Coercible a   b =>   Coercible (List a)   (List b)       -- old
instance Coercible []  b =>   Coercible List       b              -- new
instance Coercible b   [] =>  Coercible b          List           -- new

This solves the cases above. It does not solve all cases, though. Consider

newtype NT1 a = NT1 (a -> Int)
newtype NT2 a = NT2 (a -> Int)

and we want to solve Coercible (T NT1) (T NT2). Although, by the definition above, Coercible NT1 NT2 should hold, such a coercion cannot be created (as far as I can see).

Trac metadata
Trac field Value
Version 7.6.3
Type Task
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Compiler
Test case
Differential revisions
BlockedBy
Related
Blocking
CC goldfire
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information