ie-developers / ie-questions

public questions for ie students.
10 stars 0 forks source link

HaskellにおけるLstへの関手について #5

Closed maeken2010 closed 10 years ago

maeken2010 commented 10 years ago

ちょっとプログラミングとは違うのですが…

Haskellにおける関手についてですが,例えば圏Haskからリストの圏Lstへの関手は

  1. 対象aをLstの対象[a]にすること
  2. fmapを用いて射a->bをLstの射[a]->[b]にすること これらの対応付けをひっくるめて関手,と理解して正しいのでしょうか.とすると
lst_m = map (*2)

とした場合,(*2)という射はLst_mというLstの射へ対応付けたことになるのでしょうか…?

あとこれは要望なのですがHaskell勉強会やりませんか…!

atton commented 10 years ago
  1. 対象aをLstの対象[a]にすること
  2. 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) と括弧を書けば分かりやすいかな

atton commented 10 years ago

Haskell 勉強会の件は別 issue 切りますー

maeken2010 commented 10 years ago

わかりました,ありがとうございます!