5. モナドを扱い始めると >>= (bind)演算⼦がネストして
いく(⼀種のcallback hell)
先⾏する計算の⽂脈を引き継ぐという意味では⾃然な
表現かも 読み書きにはあまり優しくないが
λ> :{
λ| -- 例として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]
9. 簡潔に書き換える構⽂として for 式がある
scala> for
| x <- Some(2)
| y <- Some(10)
| yield scala.math.pow(x, y).toInt
val res1: Option[Int] = Some(1024)
// Seqに対しても同様に
scala> for
| x <- Seq(1, 2, 3)
| y <- Seq(4, 5)
| yield x * y
val res2: Seq[Int] = List(4, 5, 8, 10, 12, 15)
9
11. nullable (nullになりうる値)に対して
>>> import kotlin.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. ライブラリ の 関数を利⽤する
Arrow nullable
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