描述 Free monad 的一种方法是说它是(某种类别的)内函子类别中的初始C
幺半群,其对象是从C
到的内函子C
,箭头是它们之间的自然转换。如果我们认为C
是Hask
,则内函子就是haskell中所说Functor
的,它是函子* -> *
,*
代表的对象Hask
初始时,从 endofunctort
到 monoidm
的任何映射都会End(Hask)
引发从Free t
到的映射m
。
换句话说,任何从 Functort
到 Monadm
的自然转换都会引发从Free t
到m
我本来希望能够编写一个函数
free :: (Functor t, Monad m) => (∀ a. t a → m a) → (∀ a. Free t a → m a)
free f (Pure a) = return a
free f (Free (tfta :: t (Free t a))) =
f (fmap (free f) tfta)
但这无法统一,而以下工作
free :: (Functor t, Monad m) => (t (m a) → m a) → (Free t a → m a)
free f (Pure a) = return a
free f (Free (tfta :: t (Free t a))) =
f (fmap (free f) tfta)
或其带有签名的概括
free :: (Functor t, Monad m) => (∀ a. t a → a) → (∀ a. Free t a → m a)
我在范畴论中犯了错误,还是在翻译到 Haskell 时犯了错误?
我很想在这里听到一些智慧..
PS:启用该代码的代码
{-# LANGUAGE RankNTypes, UnicodeSyntax #-}
import Control.Monad.Free