6027
Profunctorというライブラリに、以下の様な`UpStar`という型があります

<https://hackage.haskell.org/package/profunctors-4.3.2/docs/Data-
Profunctor.html#t:UpStar>  
<https://github.com/ekmett/profunctors/blob/v4.3.2/src/Data/Profunctor.hs#L67>

```

    newtype UpStar f d c = UpStar { runUpStar :: d -> f c }
    
```

これは、標準ライブラリ(?)であるbaseの`Kleisli`と同型だと思うのですが、わざわざこういうった場合に別のnewtypeを作るのはなにか理由があるのでしょうか？

<http://hackage.haskell.org/package/base-4.7.0.2/docs/Control-
Arrow.html#t:Kleisli>

```

    newtype Kleisli m a b = Kleisli { runKleisli :: a -> m b }
    
```

個人的に思いつく予想を適当に挙げると  
- 深い理由がなくても、簡単に型が作れるから、とりあえず作る  
- 微妙に意味や使い方が違うので、`Kleisli` は使いたくなかった  
- 既存のclassの継承関係や、存在しているインスタンスの影響で、直接使うと何らかの不都合が生じる  
- 直接使わないほうが、version間の互換性などで有利？
CC BY-SA 3.0
2015-02-05T09:25:07.330
5989
2015-02-27T21:09:23.343
2015-02-05T12:56:03.533
56
56
question
haskell
HaskellにおけるProfunctorのUpStarとControl.Arrow.Kleisliについて
いくつか技術的に重要な点があります。

`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`と呼ばれるべきでしたし、その逆もそうなのですが、いくつかの資料から用語を持ってくるときに、間違いをそのまま持ってきてしまいました。
CC BY-SA 3.0
2015-02-05T22:43:59.267
6027
2015-02-27T21:09:23.343
2015-02-27T21:09:23.343
8101
8101
5989
answer