所以我理解一个自由对象被定义为一个附属的左侧。但是,这是如何引导您对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 = foldFree
和bwd = (. liftF)
(我认为?)
但这些法律如何导致Control.Monad.Free
中的结构?你如何提出data Free f a = Return a | Free (f (Free f a))
?当你想出满足法律的东西时,你肯定不会猜到吗?同样的问题适用于图形的自由类别,集合的自由幺半群以及您想要命名的任何其他自由对象。