Arrowちょっとわかった
疲れたと言いつつ、夜更かしするのが、ここ1ヶ月ぐらいの俺。
モナドもようわかっとらんのに、最近Arrowを勉強してみようと思ってみました。
以下のサイトのまとめが一番わかりやすかったです。
言語ゲーム - How To Arrow 基本
言語ゲーム - How To Arrow2 並置
言語ゲーム - How To Arrow3 選択
以下は、自分が思ったモナドとArrowの違いをまとめる。こう書けるようになるという表現についていっているので、理論だとかわかりません。間違ってる可能性大なので、気をつけて。
通常、ある関数を適用して、他の関数にそれを適用するというのは、
(head . words) "hoge moge uga"
のように、関数合成や括弧を使って書かなければいけなく、先に適用されていて欲しい関数が後ろにいってしまいます。
モナドは独特の型を用意することでデータを抽象化し、モナド則
によって、手続き型のように書くことができます。
moge <- return (words "hoge moge uga") words moge
または、
(return (words "hoge moge uge")) >>= head
こう書ける。言いたいのは、適用されたい処理順に書けるようになったということです。
処理される順を得たことにより、モナドでは、なれていないと型を考えるのが大変になります。データをモナドでくるませてみたり、モナドからとりだしたりとかを関数によって考えなければならなくなります。
そこで、Arrow。Arrowは、モナドとは逆に関数を抽象化(変換?)することによって、順序を素直に書けるようになります。
(arr words >>> arr head) "hoge moge uge"
arrが関数をArrowにする関数。このarrとかのおもしろいと思ったのが、分配則があるので以下のようにかける。
arr ( words >>> head) "hoge moge uge"
関数の並びは、モナドと時と同じ順で書けるんですが、データはふつうのデータを使えるので、あまり考えなくて書けるので、今のところモナドよりわかりやすい気がします。(簡単なtoyプログラム程度なら関数をとにかくarrでArrowにしてあげれば、だいたいおkじゃないかと。)
分岐や並置など他にもおもしろそうな機能(?)があるのですが、それはまた別のお話というか、リンク先で。
とりあえず、適当に選んだ関数の例が微妙に言語ゲームさんのところと似た感じになってしまったのは、申し訳ないと思ってしまいました。