一つの方法は、それがオブジェクトC
からC
にendofunctorsている(一部のカテゴリC
の)endofunctorsのカテゴリに初期モノイドであると言うことです、矢印がありますそれらの間の自然な変換。私たちはHask
するC
を取る場合は、endofunctorは*
がinitialityことでHask
無料モナドと自由操作
、End(Hask)
誘導におけるモノイドm
へendofunctor t
から任意のマップのオブジェクトを表し* -> *
からファンクタである、HaskellでFunctor
と呼ばれるものですFree t
からm
までの地図。
。前記は、さもなければ、モナドm
へのFunctor t
から任意の自然変換はIを関数を作成することができると予想しているであろうm
からFree t
から自然形質転換を誘導
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:それを持つコードはHaskellの翻訳が間違っているようだ
{-# LANGUAGE RankNTypes, UnicodeSyntax #-}
import Control.Monad.Free
もちろん、それは確かに – nicolas