I think you need a ‘Sub’.

A cast  (e `cast` g) requires a representational coercion.  I think you have 
given it a (stronger) nominal one.  Sub gets from one to t’other.

Simon

From: Glasgow-haskell-users [mailto:glasgow-haskell-users-boun...@haskell.org] 
On Behalf Of Conal Elliott
Sent: 14 April 2014 06:00
To: ghc-d...@haskell.org; glasgow-haskell-users@haskell.org
Subject: Help with coercion & roles?

I’m working on a GHC plugin (as part of my Haskell-to-hardware work) and 
running into trouble with coercions & roles. Error message from Core Lint:

Warning: In the expression:



  LambdaCCC.Lambda.lamvP#

    @ (GHC.Types.Bool → GHC.Types.Bool → GHC.Types.Bool → GHC.Types.Bool)

    @ (Simple.HasIf GHC.Types.Bool)

    "tpl"#

    ((LambdaCCC.Lambda.varP#

        @ (GHC.Types.Bool → GHC.Types.Bool → GHC.Types.Bool → GHC.Types.Bool)

        "tpl"#)

     `cast` (<LambdaCCC.Lambda.EP>_N (Sym (Simple.NTCo:HasIf[0] 
<GHC.Types.Bool>_N))

             ∷ LambdaCCC.Lambda.EP

                  (GHC.Types.Bool

                   → GHC.Types.Bool → GHC.Types.Bool → GHC.Types.Bool)

                  ~#

                LambdaCCC.Lambda.EP (Simple.HasIf GHC.Types.Bool)))



Role incompatibility: expected nominal, got representational

in <LambdaCCC.Lambda.EP>_N (Sym (Simple.NTCo:HasIf[0] <GHC.Types.Bool>_N))

Do you see anything inconsistent/incompatible in the coercions or roles above? 
I constructed the nominal EP Refl coercion, and applied it (AppCo) an existing 
coercion of a simpler type.

Thanks,
-- Conal
_______________________________________________
Glasgow-haskell-users mailing list
Glasgow-haskell-users@haskell.org
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users

Reply via email to