一種方式是說,這是在endofunctors類別的初始獨異,其對象是endofunctors從C
到C
(某些類別C
的),箭頭是它們之間的自然轉換。如果我們把C
是Hask
,該endofunctor被所謂Functor
在Haskell,這是從* -> *
函子,其中*
代表Hask
免費單子和自由運作來形容免費單子
通過initiality的對象,從endofunctor t
任何映射到一個獨異m
在End(Hask)
誘導從Free t
到m
的地圖。
說,否則,從一個仿函數t
任何改造自然的單子m
誘導從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
當然......這的確很明顯 – nicolas