モナドを扱い始めると >>= (bind)演算⼦がネストして
いく(⼀種のcallbackhell)
先⾏する計算の⽂脈を引き継ぐという意味では⾃然な
表現かも 読み書きにはあまり優しくないが
λ> :{
λ| -- 例としてMaybe
λ| Just 2 >>= x ->
λ| Just 10 >>= y ->
λ| return $ x ^ y
λ| :}
Just 1024
it :: Num b => Maybe b
5
6.
簡潔に書き換える構⽂として do 記法がある
のようにネストしたコードではなく 命令型の
プログラム⾵のフラットなコードになる
λ> :{
λ| do
λ| x <- Just 2
λ| y <- Just 10
λ| return $ x ^ y
λ| :}
Just 1024
it :: Num b => Maybe b
λ> :{ -- リストに対しても同様に
λ| do
λ| x <- [1, 2, 3]
λ| y <- [4, 5]
λ| return $ x * y
λ| :}
[4,5,8,10,12,15]
it :: Num b => [b]
nullable (nullになりうる値)に対して
>>> importkotlin.math.pow
>>> (2.0 as Double?)?.let { x ->
... (10.0 as Double?)?.let { y ->
... x.pow(y).toInt()
... }
... }
res1: kotlin.Int = 1024
11
12.
Iterableに対して
>>> listOf(1, 2,3).flatMap { x ->
... listOf(4, 5).map { y ->
... x * y
... }
... }
res2: kotlin.collections.List<kotlin.Int> = [4, 5, 8, 10, 12,
15]
12
13.
ライブラリ の 関数を利⽤する
Arrownullable
import arrow.core.raise.nullable
import kotlin.math.pow
nullable {
val x = (2.0 as Double?).bind()
val y = (10.0 as Double?).bind()
x.pow(y).toInt()
}
13