真面目なノート

こまめにその日の進捗などをメモしておく。

もなどともにゃもにゃ

4/16

 勉強

応用情報

応用情報の勉強はつまらないのであまりやりたくない。。。

Haskell

Haskellの勉強はたのしい!

ファンクター、アプリカティブ、モナドについてはHaskellの勉強を始めた時から今まで、ずっとわからないままだ。しかし何度も調べたりしている内にちょっとずつわからないでもないような……感じになってきたので、頑張っていきたい。

bindとかfmapとかreturnとか

ここらへんがちょっとわかった、気がする。
ウォークスルー Haskell の説明が良い感じだった。このあたり、集合論というか、圏論にも関わってきそうな話に見えないことも無いので、最終的にはやはりHaskellで学ぶ圏論あたりを目標にして勉強していきたい。

モナド - ウォークスルー Haskell

ものすごく簡単な例として、ある数値に1を足すことを考えていく。

(+1) 10 --- 11
(+1) 12 --- 12

fmap

関数を文脈に作用する関数に持ち上げる。( lift )

(+1) 1 --- 2
fmap (+1) (Just 1) --- Just 2

この例では、1という数値に対する関数であった (+1) が、Maybeという失敗可能性の文脈に作用する関数に持ち上げられている。
したがって、以下のようにもできる。

map (fmap (+1)) [Just 1,Just 2] --- [Just 2,Just 3]

bind, return

bind演算子(>>=)はfmapと同様、関数の持ち上げをする。
return は普通の値に文脈を付与する。

したがって、return と bind は、次のように使う。

Just 1 >>= return.(+1) --- Just 2
Nothing >>= return.(+1) --- Nothing

モナドをbindする関数はモナドを返す必要があるため、returnを使う。

モナドのリストに作用させてみる

ここがちょっと悩んだ。というのも、リスト自体が非決定性計算の文脈を持つモナドだから。

  • fmapを使うと、 Monad -> Monadの関数が作成されること。
  • bind演算子は関数を作ってくれるわけではないため、ラムダ式などで関数を定義してあげること。

このあたりを覚えておけば良さそう?(bind演算子に関してはもっと良いやり方があるかもしれない)

map (fmap (+1)) [Just 1, Just 2] --- [Just 2,Just 3]
map (\x -> x >>= return.(+1)) [Just 1, Just 2] --- [Just 2,Just 3]

map (fmap length) [Just "hogehoge", Just "piyoyo"] --- [Just 8,Just 6]
map (\x -> x >>= return.length) [Just "hogehoge", Nothing] --- [Just 8,Nothing]

Haskell、たのしい。