聞いたことがあるかもしれません
モナドは、エンドファンクターのカテゴリーのモノイドです
そして、モノイドは単なるリストであるとすでに述べました。それで、あなたはそこにいます。
それを少し拡張します:
data Free f a = Pure a
| Free (f (Free f a))
通常の のリストでa
はなく、 の中で末尾が折り返されたリストf
です。複数のネストされたバインドの値の構造を記述すると、それが表示されます。
pure x >>= f >>= g >>= h :: Free m a
につながる可能性があります
Free $ m1 $ Free $ m2 $ Free $ m3 $ Pure x
where m1, m2, m3 :: a -> m a -- Some underlying functor "constructors"
上記m
の例で sum タイプの場合:
data Sum a = Inl a | Inr a
deriving Functor
次に、各コンストラクターで左または右に分岐できるため、リストは実際にはツリーです。
聞いたことがあるかもしれません
Applicative は、エンドファンクタのカテゴリのモノイドです。
...カテゴリが違うだけです。Roman Cheplyaka のブログ投稿には、さまざまな無料のアプリカティブ エンコーディングの優れた視覚化があります。
だから無料Applicative
もリストです。f a
私はそれを異種の値のリストと単一の関数として想像します:
x :: FreeA f a
x = FreeA g [ s, t, u, v]
where g :: b -> c -> d -> e -> a
s :: f b
t :: f c
u :: f d
v :: f e
この場合、テール自体は でラップされませんf
が、各要素は個別にラップされます。これは、 と の違いを理解するのに役立つ場合と、そうでない場合がApplicative
ありMonad
ます。
上記のモナドに反して、makeでf
ある必要はないことに注意してください。Functor
Applicative (FreeA f a)
Free
無料もありますFunctor
data Coyoneda f a = Coyoneda :: (b -> a) -> f b -> Coyoneda f a
これにより、任意の* -> *
タイプが作成されますFunctor
。上記のフリーと比較してくださいApplicative
。適用可能なケースでは、値の長さnの異種リストf a
と、それらを組み合わせた n 項関数がありました。コヨネダは上記の 1 項の特殊なケースです。
Coyoneda
とを組み合わせて自由なモナドFree
を作ることができます。Operational
そして、他の回答が言及しているように、関係する機能があるため、それはツリーとして想像できるものではありません。OTOH、あなたはそれらの継続をあなたの写真の異なる魔法の矢として想像することができます:)