Arrowの紹介その2

DANEKO
PicApp Tech Blog
Published in
5 min readDec 1, 2018

--

二日目です。前回はこちら

前回幾つかのDataTypeを紹介しました。
またサンプルコードもすごく簡単なものを掲載しました。
とはいえあれだけだと色々と物足りないかと思います。

そんなあなたに下記のサンプルをお届けします。

flatMap自体はRxJavaでもよく出てきますし、シグネチャ的には問題ないと思います。
が、そんなflatMap内で再度flatMapを呼ぶケースって結構出てきませんか?
こんなときにスッキリ掛ける方法が、上記のSampleとなります。
flatMapの代わりにbind()を呼び出すと、中身が取り出せます。

このSyntaxに関するDocumentで、ForXXX extensions ...tという表記を見かけますが、0.8.xからは↑のサンプルのような表記となっています。
下記PRがMergeされるまではその辺注意してください。

https://github.com/arrow-kt/arrow/pull/1082

え、mが付くなんとかが書かれていて怖い??
大丈夫です。とりあえずは flatMapが生えているものをそういうふうに呼ぶ…くらいの理解で使うだけなら問題ないと思います。(あくまでも個人の見解です。)

関連する公式Documentはこちらのはず。
モナド内包表記とでも訳せば良いのかな…?

実はこの表記方法、みんな大好き(?)Coroutineを利用して実装されています。

あーなるほどねー、完全に(ry

suspend fun <B> Kind<F, B>.bind(): B = bind { this }

bindはこんな感じに拡張関数が用意されているんですねぇ…
まあKindってなんやねん…と思うでしょうけど、
Kind<ForOption,A>Option<A>で、Kind<ForTry,A>ならTry<A>のことを示している…ぐらいで一旦はOKです。

また、上のDocumentや実装コードを見るとbindInという実行時のThreadを指定できるものも用意されているのに気がつくと思います。
うーん、最初に考えた人すごいな…

さて、今回のsampleに fix()という謎methodが出てきていますが、
こちらはArrowのお約束のようなものです。

fix()を消すとresultがKind<ForOption, C>という型になるはずです。

Kind<ForOption, C>はtypealiasでOptionOf<C>と見なされます。

このOptionOf<*>fix()が生えており、結果Kind<ForOption, C>fix()を呼ぶことでOption<C>に直る。

というフローになっています。
さて、肝心のコードは…というと、こちらAnnotationProcessingによって生成されるため、githubのリンク的なものはないのです…
代わりに実際のコードの一部を貼っておきます

一旦は

* Kind<ForXXX, A>にはfix()というのがあって、呼ぶとXXX<A>になる
* いろんな実装都合で、XXX<A>はKind<ForXXX,A>で返ることがある

と覚えておけば大丈夫です。
利用する上では困らないはずです。
(この記事の目標はArrowを便利に使ってもらうことですので!)

なおfix()を使わなくても動くものもあります。0.8.2でさらにその範囲が広がるようです。

次回はこのKindに焦点をあててみたいと思います!

え、Kindについてもっと手早く知りたい?
(多分間違ってないと思うけど)高カインド型はKotlinそのものじゃどうしようもなかったので、一旦Kindという型コンストラクタというかなんというかを用意して、頑張っている!
みたいな感じです。
ちなみにKindはこんな感じにKind22まで定義されています。
なにか機会があったらまたBlogかなにかで…

最後に
一緒にArrowを普及するメンバーやArrowを触ってみたい人も随時募集(従業員という意味でも知人という意味でも)しています。
少しでも興味を持っていただけたら、下記FormでなくともDMとかでお気軽にお声掛けください。
お試し就職とかもあるよ!

https://dmm-corp.com/recruit/engineer/5552

--

--