固定点代表性的bifunctors

时间:2015-12-04 03:53:03

标签: haskell ghc coercion

Edward Kmett的实验roles package提供了各种用于解除强制的工具,其中一些是我在这个问题的最后粘贴的。包中的关键类是

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)

1 个答案:

答案 0 :(得分:5)

如上所述,问题无法解决,因为p Representational(甚至Phantom这一事实意味着{{ 1}}具有代表性。这是一个反例:

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 s的无限链会花费无限的时间,并且Coercion s不能懒得匹配

一个(可能有效?)概念,我只是suggested on GitHub

Coercion

迫使应用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 的目的是(希望)确保它实际终止,因此它的类型可以信任。