Star (a.k.a UpStar) の理解のために
むかしはUpStar/DonwStarといっていたが、最新ではStar/CoStarとなっている。
http://hackage.haskell.org/package/profunctors-5.5.1/docs/src/Data.Profunctor.Types.html#Star
Lift a 'Functor' into a 'Profunctor' (forwards).
なんて書いてあります。Functorを持ち上げてProfunctorにしてくれるとのこと。
fmapしか使えなかったのが、dimapも使えるようになるという雑な理解をする。
例のための例になりますが、具体的なStarを作ってみる。
> :t Star Star :: (d -> f c) -> Star f d c > :t Just Just :: a -> Maybe a > :t Star Just Star Just :: Star Maybe c c >
つかってみる。
> runStar (Star Just) 65 Just 65 > runStar (Star Just) 'a' Just 'a' > runStar (Star Just) "#" Just "#"
もともとFunctorだったから、fmapが使えるはず。
> :t fmap chr (Star Just) fmap chr (Star Just) :: Star Maybe Int Char > :t runStar $ fmap chr (Star Just) runStar $ fmap chr (Star Just) :: Int -> Maybe Char > runStar (fmap chr (Star Just)) 65 Just 'A'
素(?)のfmapとたいひさせると、
> fmap chr (Just 65) Just 'A' > :t fmap chr . Just fmap chr . Just :: Int -> Maybe Char
dimapが使えるか確認
> :t dimap chr show (Star Just) dimap chr show (Star Just) :: Star Maybe Int String > runStar ( dimap chr show (Star Just) ) 65 Just "'A'" >