Slide 1

Slide 1 text

Functional Programming in Kotlin with Λrrow wasabeef Shibuya.apk #28

Slide 2

Slide 2 text

About me Daichi Furiya Google Developer Expert CATS @wasabeef_jp wasabeef

Slide 3

Slide 3 text

Λrrow

Slide 4

Slide 4 text

Λrrow は型付き関数型言語を実現 するための Kotlin 向けライブラリ です Λrrow

Slide 5

Slide 5 text

Λrrow Paco の Twitter より

Slide 6

Slide 6 text

build.gradle def arrow_version = "0.7.3" !// 2018.9.28 dependencies { implementation "io.arrow-kt:arrow-core:$arrow_version" implementation "io.arrow-kt:arrow-syntax:$arrow_version" implementation "io.arrow-kt:arrow-typeclasses:$arrow_version" implementation "io.arrow-kt:arrow-data:$arrow_version" implementation "io.arrow-kt:arrow-instances-core:$arrow_version" implementation "io.arrow-kt:arrow-instances-data:$arrow_version" kapt "io.arrow-kt:arrow-annotations-processor:$arrow_version" implementation "io.arrow-kt:arrow-free:$arrow_version" !// optional implementation "io.arrow-kt:arrow-mtl:$arrow_version" !// optional implementation "io.arrow-kt:arrow-effects:$arrow_version" !// optional implementation "io.arrow-kt:arrow-effects-rx2:$arrow_version" !// optional implementation "io.arrow-kt:arrow-effects-reactor:$arrow_version" !// optional implementation “io.arrow-kt:arrow-effects-kotlinx-coroutines:$arrow_version" !// optional implementation "io.arrow-kt:arrow-optics:$arrow_version" !// optional implementation "io.arrow-kt:arrow-generic:$arrow_version" !// optional implementation "io.arrow-kt:arrow-recursion:$arrow_version" !// optional }

Slide 7

Slide 7 text

Data Types

Slide 8

Slide 8 text

Data Types %BUB5ZQFT 0QUJPO &JUIFS 5SZ 7BMJEBUFE /PO&NQUZ-JTU -JTU, 4FRVFODF, 4FU, .BQ, 4PSUFE.BQ, *PS *E 3FBEFS ,MFJTJM 4UBUF 4UBUF5 8SJUF5 5SBNQPMJOF $PQSPEVDU &WBM &JUIFS5 'VODUJPO 'VODUJPO $POTU 5ZQF$MBTTFT 4IPX &R 0SEFS 4FNJHSPVQ .POPJE 'PMEBCMF #JGPMEBCMF 5SBWFSTF 3FEVDJCMF 5SBWFSTF'JMUFS 'VODUPS 'VODUPS'JMUFS "QQMJDBUJWF "QQMJDBUJWF&SSPS .POBE .POBE&SSPS .POBE'JMUFS .POBE3FBEFS .POBE8SJUFS .POBE4UBUF .POBE$PNCJOF $PNPOBE #JNPOBE #JGVODUPS 1SPGVODUPS 4FNJHSPVQ, .POBE, *OKFDU "MUFSOBUJWF &⒎FDUT *0 .POBE%FGFS "TZOD &⒎FDU 0QUJDT *TP -FOT 0QUJPOBM 1SJTN (FUUFS 4FUUFS 'PME 5SBWFSTBM "U *OEFY 'JMUFS*OEFY &BDI

Slide 9

Slide 9 text

Data Types %BUB5ZQFT 0QUJPO &JUIFS 5SZ 7BMJEBUFE /PO&NQUZ-JTU -JTU, 4FRVFODF, 4FU, .BQ, 4PSUFE.BQ, *PS *E 3FBEFS ,MFJTJM 4UBUF 4UBUF5 8SJUF5 5SBNQPMJOF $PQSPEVDU &WBM &JUIFS5 'VODUJPO 'VODUJPO $POTU 5ZQF$MBTTFT 4IPX &R 0SEFS 4FNJHSPVQ .POPJE 'PMEBCMF #JGPMEBCMF 5SBWFSTF 3FEVDJCMF 5SBWFSTF'JMUFS 'VODUPS 'VODUPS'JMUFS "QQMJDBUJWF "QQMJDBUJWF&SSPS .POBE .POBE&SSPS .POBE'JMUFS .POBE3FBEFS .POBE8SJUFS .POBE4UBUF .POBE$PNCJOF $PNPOBE #JNPOBE #JGVODUPS 1SPGVODUPS 4FNJHSPVQ, .POBE, *OKFDU "MUFSOBUJWF &⒎FDUT *0 .POBE%FGFS "TZOD &⒎FDU 0QUJDT *TP -FOT 0QUJPOBM 1SJTN (FUUFS 4FUUFS 'PME 5SBWFSTBM "U *OEFY 'JMUFS*OEFY &BDI

Slide 10

Slide 10 text

Option Either Validated Data Types Try

Slide 11

Slide 11 text

Option

Slide 12

Slide 12 text

Option の利点は Null Safty より も安全に値がないことを表現できる こと Option

Slide 19

Slide 19 text

Either

Slide 20

Slide 20 text

Either は2つの値のうちの1つを返す可能 性のある戻り値の型をモデル化するための ものであり、 失敗にも値を付加できるの で、何が失敗したか表現できるものです Either

Slide 25

Slide 25 text

Validated

Slide 26

Slide 26 text

Validated は、成功値またはエラー の戻り値をモデル化するためにもの です Validated

Slide 27

Slide 27 text

Validated Validated 周りで頻繁に登場するクラス群 sealed class Validated : ValidatedOf { !!... } data class Valid(val a: A) : Validated() data class Invalid(val e: E) : Validated()

Slide 28

Slide 28 text

Validated シンプルな構文例 val aaa: Validated = Valid(123) val bbb: Validated = Invalid(Throwable("eee"))

Slide 29

Slide 29 text

Validated If や fold での判定する場合は if (vali.isInvalid) { !!... } if (vali.isValid) { !!... } vali.fold({ !// if Invalid }, { !// if Valid })

Slide 30

Slide 30 text

Validated Validated#toOption で Option 型として扱う val aaa = Valid(123).toOption() !// Some(t=123) val bbb = Invalid(Throwable()).toOption() !// None

Slide 31

Slide 31 text

Validated val aaa = Valid(123).toEither() !// Right(b=123) val bbb = Invalid(Throwable()).toEither() !// Left(a=Throwable) Validated#toEither で Either 型として扱う

Slide 32

Slide 32 text

Validated val aaa = Invalid("abcd").orElse { Valid(123) } val bbb = Invalid("abcd").getOrElse { 0 } Validated#orElse, getOrElse で Invalid の場合などに違う値を

Slide 33

Slide 33 text

Semigroup

Slide 34

Slide 34 text

複数のエラーを合成する時に使う
 Either ではエラーが発生した時点で中断 してしまうが、Validated は Semigroup などを使ってエラーを集めることができる Semigroup

Slide 37

Slide 37 text

Try

Slide 38

Slide 38 text

Tryは、例外が発生する可能性のあ る関数の呼び出しをモデル化するた めのものです Try

Slide 46

Slide 46 text

Option Either Validated Try ここまでのまとめ

Slide 47

Slide 47 text

Option nullの代わりでより安全にする ここまでのまとめ

Slide 48

Slide 48 text

Either L, Rの値を持つことができ、エラー発生 時に値を持たせられる。ただしエラー値は1つだけ ここまでのまとめ

Slide 49

Slide 49 text

Validated Semigroup でエラーを集約できる ここまでのまとめ

Slide 50

Slide 50 text

Try Throwable を Option や Either に変換する ここまでのまとめ

Slide 51

Slide 51 text

Option nullの代わりでより安全にする Either L, Rの値を持つことができ、エラー発生 時に値を持たせられる。ただしエラー値は1つだけ Validated Semigroup でエラーを集約できる Try Throwable を Option や Either に変換する ここまでのまとめ

Slide 52

Slide 52 text

Integrations

Slide 53

Slide 53 text

RxJava 2 Project Reactor kotlinx.coroutines KindedJ Integrations

Slide 54

Slide 54 text

kotlinx.coroutines

Slide 55

Slide 55 text

kotlinx.coroutines integration Deferred 周りで頻繁に登場する拡張関数、及びクラス fun Deferred.k(): DeferredK = DeferredK(this) data class DeferredK(val deferred: Deferred) : DeferredKOf, Deferred by deferred { … }

Slide 56

Slide 56 text

kotlinx.coroutines integration val deferred = async { throw RuntimeException("OMG!") } runBlocking { deferred.await() } !// CRASH! Exception! val wrapper = async { throw RuntimeException("OMG!") }.k() val eiei = wrapper.unsafeAttemptSync().toEither() !// Left(a=RuntimeException) Deferred#k() で Deferred をラップすることで Arrow の世界に持ち込む

Slide 57

Slide 57 text

kotlinx.coroutines integration DeferredK { BitmapFactory.decodeFile(!!...) } .runAsync { result !-> result.fold({ DeferredK { /** if Throwable **/ } }, { bitmap !-> DeferredK { /** Use the Bitmap **/ } }) } DeferredK は Deferred のArrowラッパーで runAsync は Either を返却してくれる

Slide 58

Slide 58 text

Conclusion

Slide 59

Slide 59 text

twitter.com/wasabeef_jp wasabeef.jp github.com/wasabeef