九州の地震は結構大変だったようですが、
* 関係ないところでは自粛したりあたふたしたりしないで、ちゃんと仕事する
というのが教訓でしょう。
それとは関係なく、ソフトウェア工学では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:
Post a Comment