Arrowの紹介その3

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

--

advent calendarの9日目、昨日は StackCardLayoutManagerを公開した!!!!!でした。
amyu先生のgithubへの直リンクが直球な感じで良いですねw

前回MonadComprehensionsという表記方法を簡単に紹介しました。
そして突如現れたKind<ForXXX,A>というものを紹介しました。Kind<ForXXX,A>fix()というメソッドを呼ぶことでXXX<A>に戻せる…という雑な説明もしました。

さて、そんなKind<ForXXX,A>を利用したテクニックを少し紹介したいと思います。また、以降Kind<F,A>と表記します。

さて…これらの何が嬉しいのでしょうか?
そもそもにおいてOptionやTry,Eitherを入れ替える…というケースはそこまではなさそうな気もします。一方でロジック側を考えると、OptionやらTryやらのことを気にすることなく書けています。

ObservableK(上の例だとSingleK)やDeferredKにしたケースを見てみましょう。

ObservableKはRxJavaのObservableをラップしたもので、基本的にはObservableと同じ使い方が可能です。
DeferredKはDeferred、つまりKotlinのCoroutineのDeferredをラップしたものになります。

全体をReactiveな感じにするのか、それともただの非同期処理でしか利用しないか…みたいなRx使うかどうか悩んでいる時でも実装が進められますね!
(そういう使い方をするかどうかは別として)

さらにTestするときを考えてみましょう。
そもそもテストしたい対象は、OptionなのかTryなのかObservableKなのか…とかに興味があるのでしょうか?
場合によっては「正常系だけある程度見れていれば良い」なら、テストのときだけOptionInstanceで動作させるとかもありだと思います。
(IdMonadなんかも良いと思いますが、非同期処理前提だったりすると、IdやOption自体適さない可能性はある)

あくまでも↑のサンプルはこうかける!というのを極力単純化したものです。もっといろいろと見てみたい人は、公式DocumentのErrorHandling#MonadErrorの項目や、その次のValidatedとEitherを使い分けている項目なんかがまずはオススメな気がします。

他にもSimple Dependency Management in KotlinというAndroidTOというイベントで発表された内容とかがわかりやすいかと思います。
この発表の資料、なんとIntellij上で事前に書いてきたコードを説明するという…LiveTemplateすら使っていないという…
でもわかるのでなんかこういう発表形式もよいなぁ…って思いますw

さて公開前日にいろいろと見直したりしてましたが、どうやらこのAdventCalendar、まだ空きがあるようなので…
↑の動画の12分くらいでも簡単に説明しているのですが…
改めてなぜKindが必要なのか…とかそのへんを紹介できれば…と思います。
あとはArrowQueryLanguageとか。
もちろん誰も埋めなくて、なんか余裕あれば…という前提ですけども。

その他参考

これを書いていたら、去年のUL SystemsさんのAdventCalendarでCatsについての記事があったのに気が付きました。
内容的にはArrowにそのまま適応できるようなものだと思いますので、リンクを貼っておきます。

いやいやScalaじゃん…?と思われるでしょうが、Arrowはそもそも

Kats → KATEGORY → Arrow と名前を変えてきた経緯もあります。
実際0.3.10までのREADMEにも

Functional Datatypes and abstractions for Kotlin inspired by Cats

とあるように、Catsの影響はデカイです。
なので、Arrowで困ったらCatsについての記述を探すと意外と答えがあるかもしれません。

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

--

--