Edward Kmett的实验角色包提供了各种用于解除强制的工具,其中一些是我在这个问题的最后粘贴的.包中的关键类是
class Representational (t :: k1 -> k2) where -- | An argument is representational if you can lift a coercion of the argument into one of the whole rep :: Coercion a b -> Coercion (t a) (t b)
鉴于类型
newtype Fix p a = In {out :: p (Fix p a) a}
我希望能写出类似的东西
instance Representational p => Representational (Fix p)
我相信以下内容应该有效,除了一件丢失的内容.我也有点担心,bar
可能会严格到将一切都扔进一个无限循环.
-- With {-# LANGUAGE PolyKinds, ScopedTypeVariables, etc.) import Data.Type.Coercion import Data.Coerce import Data.Roles instance Representational p => Representational (Fix p) where rep :: forall a b . Coercion a b -> Coercion (Fix p a) (Fix p b) rep x = sym blah . quux . baz . blah where bar :: Coercion (p (Fix p a)) (p (Fix p b)) bar = rep (rep x) baz :: Coercion (p (Fix p a) a) (p (Fix p b) a) baz = eta bar quux :: Coercion (p (Fix p b) a) (p (Fix p b) b) quux = undefined -- ????????? blah :: forall x . Coercion (Fix p x) (p (Fix p x) x) blah = Coercion
roles
eta :: forall (f :: x -> y) (g :: x -> y) (a :: x). Coercion f g -> Coercion (f a) (g a) instance Representational Coercion instance Representational f => Representational (Compose f)
dfeuer.. 5
这个问题,如上所述,不能得到解决,因为这其实p
是Representational
(甚至Phantom
)不不意味着p (Fix p a)
是代表性.这是一个反例:
data NF a b where NF :: NF a () instance Representational NF where rep _ = Coercion
显然,NF a
永远不具代表性; 我们不可能实施
rep :: Coercion x y -> Coercion (NF a x) (NF a y)
(无论选择何种a
)因为NF a x
只有在居住时才有人居住x ~ ()
.
因此,我们需要一个更为精细的代表性双向概念来使这个观点变得合情合理.unsafeCoerce
几乎肯定有必要在任何情况下实现它,因为挖掘无限的Coercion
s 链将花费无限的时间,并且Coercion
s不能懒得匹配.
一个(可能有效?)概念,我刚刚在GitHub上建议:
class Birepresentational t where birep :: Coercion p q -> Coercion a b -> Coercion (t p a) (t q b) instance Birepresentational f => Representational (Fix f) where rep (x :: Coercion a b) = (birep :: forall p q x y . Coercion p q -> Coercion x y -> Coercion (f p x) (f q y)) (unsafeCoerce x :: Coercion (Fix f a) (Fix f b)) x `seq` unsafeCoerce x
强制应用的目的birep
是(希望)确保它实际终止,因此它的类型可以被信任.
这个问题,如上所述,不能得到解决,因为这其实p
是Representational
(甚至Phantom
)不不意味着p (Fix p a)
是代表性.这是一个反例:
data NF a b where NF :: NF a () instance Representational NF where rep _ = Coercion
显然,NF a
永远不具代表性; 我们不可能实施
rep :: Coercion x y -> Coercion (NF a x) (NF a y)
(无论选择何种a
)因为NF a x
只有在居住时才有人居住x ~ ()
.
因此,我们需要一个更为精细的代表性双向概念来使这个观点变得合情合理.unsafeCoerce
几乎肯定有必要在任何情况下实现它,因为挖掘无限的Coercion
s 链将花费无限的时间,并且Coercion
s不能懒得匹配.
一个(可能有效?)概念,我刚刚在GitHub上建议:
class Birepresentational t where birep :: Coercion p q -> Coercion a b -> Coercion (t p a) (t q b) instance Birepresentational f => Representational (Fix f) where rep (x :: Coercion a b) = (birep :: forall p q x y . Coercion p q -> Coercion x y -> Coercion (f p x) (f q y)) (unsafeCoerce x :: Coercion (Fix f a) (Fix f b)) x `seq` unsafeCoerce x
强制应用的目的birep
是(希望)确保它实际终止,因此它的类型可以被信任.