如何构建自由对象?

时间:2016-11-20 12:48:04

标签: haskell monads free-monad

所以我理解一个自由对象被定义为一个附属的左侧。但是,这是如何引导您对Haskell定义这些对象的呢?

更具体地说:给出一个健忘的算子"从monad类别到endofunctors类别,

newtype Forget m a = Forget (m a)
instance Monad m => Functor (Forget m) where
    fmap f (Forget x) = Forget (liftM f x)

然后免费monad Free :: (* -> *) -> (* -> *)是一个允许(Monad实例的类型)以及以下同构:

type f ~> g = forall x. f x -> g x

fwd :: (Functor f, Monad m) => (f ~> Forget m) -> (Free f ~> m)
bwd :: (Functor f, Monad m) => (Free f ~> m) -> (f ~> Forget m)

fwd . bwd = id = bwd . fwd

如果我们放弃Forget s,对于Control.Monad.Free中的免费monad,我们有fwd = foldFreebwd = (. liftF)(我认为?)

但这些法律如何导致Control.Monad.Free中的结构?你如何提出data Free f a = Return a | Free (f (Free f a))?当你想出满足法律的东西时,你肯定不会猜到吗?同样的问题适用于图形的自由类别,集合的自由幺半群以及您想要命名的任何其他自由对象。

0 个答案:

没有答案