当前位置:  开发笔记 > 编程语言 > 正文

固定点代表性的bifunctors

如何解决《固定点代表性的bifunctors》经验,为你挑选了1个好方法。

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

这个问题,如上所述,不能得到解决,因为这其实pRepresentational(甚至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几乎肯定有必要在任何情况下实现它,因为挖掘无限的Coercions 链将花费无限的时间,并且Coercions不能懒得匹配.

一个(可能有效?)概念,我刚刚在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是(希望)确保它实际终止,因此它的类型可以被信任.



1> dfeuer..:

这个问题,如上所述,不能得到解决,因为这其实pRepresentational(甚至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几乎肯定有必要在任何情况下实现它,因为挖掘无限的Coercions 链将花费无限的时间,并且Coercions不能懒得匹配.

一个(可能有效?)概念,我刚刚在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是(希望)确保它实际终止,因此它的类型可以被信任.

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有