描述 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