Profunctors的免费monads模拟

我们可以定义data Free fa = Pure a | Free (f (Free fa)) data Free fa = Pure a | Free (f (Free fa)) ,所以Functor f => Monad (Free f)

如果我们定义data T fab = R a | S b | T (fa (T fab)) data T fab = R a | S b | T (fa (T fab)) data T fab = R a | S b | T (fa (T fab))有我们一些类似的M所以Profunctor f => M (T fa) ,其中class Profunctor f where dimap :: (a -> b) -> (c -> d) -> fbc -> fad

自从我注意到Data.Comp.Term.ContextFree对于Data.Comp.Param.Term.Context的潜在模拟是同构的,我一直在想。


所以,我想我想通了: M ~ Monad

instance Profunctor f => Functor (T f a) where
    fmap f (In m) = In (dimap id (fmap f) m)
    fmap f (Hole x) = Hole (f x)
    fmap f (Var v) = Var v

instance Profunctor f => Applicative (T f a) where
    pure = Hole
    (<*>) = ap

instance Profunctor f => Monad (T f a) where
    In m >>= f = In ((>>= f) <$> m)
    Hole x >>= f = f x
    Var v >>= _ = Var v

似乎在后见之明显。


有一个更合适的概念,即从一个合作者那里获得免费的东西。 然后我们可以通过类比工作。

由集合X产生的自由幺半群Y可以被认为是等式“Y = 1 + XY”的解。 在Haskell表示法中

data List a = Nil | Cons a (List a)

由函数F产生的自由单子M可以被认为是方程“M = 1 + FM”的解,其中乘积“FM”是函子的组成,1就是身份函数,在Haskell符号那是

data Free f a = Pure a | Free (f (Free a))

让一些东西免费,应该看起来像一个解决方案,A,“A = 1 + PA”。 产品“PA”是profunctors的标准组成。 1是“身份”团队成员, (->) 。 所以我们得到

data Free p a b = Pure (a -> b) | forall x.Free (p a x) (Free p x b)

这也是一个整体:

instance Profunctor b => Profunctor (Free b) where
    lmap f (Pure g) = Pure (g . f)
    lmap f (Free g h) = Free (lmap f g) h
    rmap f (Pure g) = Pure (f . g)
    rmap f (Free g h) = Free g (rmap f h)

如果团队力量强大,那么免费版本也是如此:

instance Strong p => Strong (Free p) where
    first' (Pure f) = Pure (first' f)
    first' (Free f g) = Free (first' f) (first' g)

但实际上Free p是什么? 这实际上是一种称为前箭头的事情。 限制,免费的强大的工作人员是箭头:

instance Profunctor p => Category (Free p) where
    id = Pure id
    Pure f . Pure g = Pure (f . g)
    Free g h . Pure f = Free (lmap f g) h
    Pure f . Free g h = Free g (Pure f . h)
    f . Free g h = Free g (f . h)

instance (Profunctor p, Strong p) => Arrow (Free p) where
    arr = Pure
    first = first'

直觉上,你能想到一个profunctor的元素P ab为采取a -ish事情到b -ish的东西,典型的例子是由给定的(->) Free P是一个未评估的这些元素链与兼容(但不可观察)的中间类型。

链接地址: http://www.djcxy.com/p/36037.html

上一篇: Analog of free monads for Profunctors

下一篇: Dagger 2 on Android. Different ways to store and access a @Singleton Component