Closed maeken2010 closed 10 years ago
- 対象aをLstの対象[a]にすること
- fmapを用いて射a->bをLstの射[a]->[b]にすること これらの対応付けをひっくるめて関手,と理解して正しいのでしょうか.とすると
そうそう。ある圏からある圏に移すものが関手(Functor)。 圏は対象と射で構成されるから、別の圏に mapping するには対象と射を別の圏に写せば良い。
Haskell で考えると「対象aを Functor に属するデータコンストラクタ([a]とか)で List 型にする」のが「対象aをLstの対象[a]にする」に相当していて、 「fmap を用いて射 a -> b を Lst の射 [a] -> [b] にすること」が「fmap で対象aを取る関数を対象[a] を取る関数に変える」ことに相当している、ってことかな。
図で書くとこんな感じかな(kono先生のやつを拝借) http://www.ie.u-ryukyu.ac.jp/%7Ekono/lecture/software/s05/fig/functor.svg (ちなみにページはここ http://www.ie.u-ryukyu.ac.jp/%7Ekono/lecture/software/s05/lecture.html)
lst_m = map (*2)
とした場合,
(*2)
という射はLst_mというLstの射へ対応付けたことになるのでしょうか…?
そんな感じ。
Prelude> :t (*2)
(*2) :: Num a => a -> a
Prelude> :t fmap (*2)
fmap (*2) :: (Num b, Functor f) => f b -> f b
a -> a が f a -> f a になってるよねー、って話。 つまり
Prelude> :t fmap
fmap :: Functor f => (a -> b) -> f a -> f b
fmap の型そのものが「関数をFunctorの関数に変換するもの」と読める。
(a -> b) -> (f a -> f b)
と括弧を書けば分かりやすいかな
Haskell 勉強会の件は別 issue 切りますー
わかりました,ありがとうございます!
ちょっとプログラミングとは違うのですが…
Haskellにおける関手についてですが,例えば圏Haskからリストの圏Lstへの関手は
a
をLstの対象[a]
にすることa->b
をLstの射[a]->[b]
にすること これらの対応付けをひっくるめて関手,と理解して正しいのでしょうか.とするととした場合,
(*2)
という射はLst_mというLstの射へ対応付けたことになるのでしょうか…?あとこれは要望なのですがHaskell勉強会やりませんか…!