Arrowの紹介その2
前回幾つかの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とかでお気軽にお声掛けください。
お試し就職とかもあるよ!