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数据结构,我认为关联的新类型,以及它们对数据构造函数的显式使用,将比类型同义词更接近原始代码。