Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 存在量化类型类_Haskell - Fatal编程技术网

Haskell 存在量化类型类

Haskell 存在量化类型类,haskell,Haskell,受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 . (M

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(pab)、Monad(pabm)
和(使用伪代码)
(Category“\ab->pabmr”)

CategoryI
MonadI
只是那些类型类的字典等价物,我用它们来表示
Category
Monad
MonadTrans
是这种
管道式
类型的超类

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

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

如果这确实是一个类型类,那么字典值仅由类型
p
确定。特别是,类型
cat
仅由
p
确定。这可以使用关联的数据类型来表示。在类定义中,关联的数据类型就像没有右手的数据定义一样编写一边

一旦将
cat
表示为一个类型,其他成员就可以很容易地更改为类型类,正如我为
Monad
MonadTrans
所示。请注意,我更喜欢对复杂的类型使用显式的种类签名

{-# 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(pabm)、MonadTrans(pab)、Category(Cat p))=>PipeLike p{-空类-}
。同构的东西只是粘在存在量化的类型上,如果我使用关联的数据类型,这是不必要的。你不能创建
Monad
MonadTrans
超类,因为给定
p
,没有办法选择
a
b
m
。但是,你可以创建我如我所示的nstance。它们将像原始接口一样工作。这是有意义的。感谢你澄清了我的想法。我接受这一点。你不更可能想要关联的类型同义词而不是关联的数据类型吗?@BenMilwood,我不知道哪个更合适。既然存在类型是显式打包和解包的,我n数据结构,我认为关联的新类型,以及它们对数据构造函数的显式使用,将比类型同义词更接近原始代码。