質問: Kleisli { runKleisli :: a -> m b } ``` 個人的に思いつく予想を適当に挙げると - 深い理由がなくても、簡単に型が作れるから、とりあえず作る - 微妙に意味や使い方が違うので、`Kleisli` は使いたくなかった - 既存のclassの継承関係や、存在しているインスタンスの影響で、直接使うと何らかの不都合が生じる - 直接使わないほうが、version間の互換性などで有利?
回答: いくつか技術的に重要な点があります。 `Kleisli`アローはKleisli圏におけるアローで、単に`m`が`Monad`である場合における`a -> m b`という型にあう何かを表すという以上の目的があります。 この意味論的な問題点を無視したとしても、更に問題があります。 ほとんどの場合、`UpStar`は`Functor`を使いますが、`Kleisli`は`Monad`を使います。 GHC 7.10では`Applicative`-`Monad`の提案(AMP)が導入されますが、それまでは以下の違いがあります。 ``` instance Monad m => Profunctor (Kleisli m) instance Functor f => Profunctor (UpStar f) ``` 現状では`Functor`は`Monad`のスーパークラスではないので、まだ前者のインスタンスを後者のようにすることはできないのです。 追記 技術的には、`UpStar`はおそらく`DownStar`と呼ばれるべきでしたし、その逆もそうなのですが、いくつかの資料から用語を持ってくるときに、間違いをそのまま持ってきてしまいました。