IT練習ノート

IT関連で調べたこと(実際は嵌ったこと)を書いています。

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'"
 >