Tuesday, 19 April 2016

Applicative

九州の地震は結構大変だったようですが、

* 関係ないところでは自粛したりあたふたしたりしないで、ちゃんと仕事する

というのが教訓でしょう。

それとは関係なく、ソフトウェア工学ではHaskellのMonadやってるんですが、なんか、

* Applicative でないと Monad にはできん

というWarningが出るようになってしまって。「7.10では切るぞ」みたいな脅し文句も...

Monad 自体は単なるデータ型で、Functor とか Applicative と同じく、共通のinterfaceを提供するものに過ぎないわけなんですが。

Functor はリストに対するmap f、つまり、リストの要素それぞれに f を作用させたリストを返すみたいなもの。

fmap :: Functor f => (a -> b) -> f a -> f b

なるほど。Monad は、

(>>=) :: Monad m => m a -> (a -> m b) -> m b

で、Applicative は、

(<*>) :: Applicative t => t (a -> b) -> (t a -> t b)

というわけで、ぜんぜんわかりません。リストだと ZipList とかの例が書いてあるけど、ぜんぜんピンと来ないぞ。

いや、 

https://en.wikibooks.org/wiki/Haskell/Applicative_functors

ここに結構丁寧に書いてあってありがたいんですけどね。

理論的には Monad は Functor でなくてはいけないんだが、それは要求されず。なんで、Applicative なのかは、

http://www.staff.city.ac.uk/~ross/papers/Applicative.html

ってな論文があるらしい。

でも、まぁ、見かけは、

fmap の f に Monadの皮がかぶっているだけ

のように見える。なので、そういうものを実装すれば良いみたいです。要求しているのは「型が合っている関数がある」だけなので、中身が正当かどうかは良くわからない。

なんだけど、実際には、Monad の >>= と、同じようになってしまって、結局、何がうれしいのだが良くわからない。

more sharing

だと書いてあるけど、なんなんだろう。

でも、Maybe だと、登場人物のfとかリストとかが、すべてMaybeの方が「まともな」感じはしますね。おそらくは f もリストから作られたクロージャーだろうし。

Monad だと、Monadの皮をいっぺんひっぺがして処理してから、もう一度Monadの皮をかぶせて返すみたいな感じがあるけど、
Applicative だと両方 Monad のままで扱えるという構文上の利点があるかな。

まぁ、一応、Warning は取れたので良しとするか。

No comments: