4

タイプに触発された、次の存在記号辞書に相当するタイプクラスは何ですか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")です。

CategoryIとは、、、、およびがこのタイプの(一種の)スーパークラスであるMonadIという考えを表現するために使用するタイプクラスに相当する辞書です。CategoryMonadMonadTransPipeLike

Isoタイプは、同型を格納する次の辞書です。

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

1 に答える 1

5

これが実際に型クラスである場合、ディクショナリ値は型によってのみ決定され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)
于 2012-08-10T21:35:51.107 に答える