【问题标题】:Existentially quantified type class存在量化类型类
【发布时间】:2012-08-10 19:00:26
【问题描述】:

Pipe 类型启发,与以下存在量化字典等效的类型类是什么:

{-# LANGUAGE ExistentialQuantification, PolymorphicComponents #-}

data PipeD p = forall cat . PipeD {
    isoI        :: forall a b   m r . Iso (->) (p a b m r) (cat m r a b),
    categoryI   :: forall       m r . (Monad m) => CategoryI (cat m r)  ,
    monadI      :: forall a b   m   . (Monad m) => MonadI (p a b m)     ,
    monadTransI :: forall a b       . MonadTransI (p a b)               }

我的粗略想法是尝试说,鉴于(PipeLike p) 约束,我们可以推断(MonadTrans (p a b), Monad (p a b m) 和(使用伪代码)(Category "\a b -> p a b m r")

CategoryIMonadI 只是我用来表达CategoryMonadMonadMonadTrans 是(某种)超类的想法的那些类型类的字典等价物这个PipeLike 类型。

Iso 类型只是以下存储同构的字典:

data Iso (~>) a b = Iso {
    fw :: a ~> b ,
    bw :: b ~> a }

【问题讨论】:

    标签: haskell


    【解决方案1】:

    如果这确实是一个类型类,则字典值仅由类型p 确定。特别是,cat 类型仅由p 确定。这可以使用关联的数据类型来表示。在类定义中,关联数据类型的编写方式类似于没有右侧的数据定义。

    一旦您将cat 表达为一个类型,就可以轻松地将其他成员更改为类型类,正如我为MonadMonadTrans 展示的那样。请注意,对于复杂的种类,我更喜欢使用显式种类签名。

    {-# LANGUAGE TypeFamilies, FlexibleInstances, UndecidableInstances #-}
    
    class Pipe (p :: * -> * -> (* -> *) -> * -> *) where
      data Cat p :: (* -> *) -> * -> * -> * -> *
      isoI      :: forall a b m r. Iso (->) (p a b m r) (Category p m r a b)
      categoryI :: forall a b m.   Monad m => CategoryI (Category p m r)
    
    instance (Pipe p, Monad m) => Monad (p a b m)
    
    instance Pipe p => MonadTrans (p a b)
    

    【讨论】:

    • 我认为关联数据类型可能是正确的方向,尽管我根本不想要任何字典。我希望得到类似的东西:class (Monad (p a b m), MonadTrans (p a b), Category (Cat p)) => PipeLike p {- empty class -}。同构的东西只是粘在存在量化类型上,如果我使用关联的数据类型,这不是必需的。
    • 你不能创建MonadMonadTrans超类,因为给定p,没有办法选择abm。但是,您可以像我展示的那样创建实例。它们将像原始界面一样工作。
    • 这是有道理的。感谢您清除我对此的想法。我会接受的。
    • 与关联数据类型相比,您不是更需要关联类型同义词吗?
    • @BenMilwood,我不知道哪个更合适。由于存在类型在数据结构中被显式打包和解包,我认为关联的新类型,以及它们对数据构造函数的显式使用,会比类型同义词更接近原始代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 2012-12-27
    • 2021-11-13
    • 1970-01-01
    相关资源
    最近更新 更多