狠狠撸

狠狠撸Share a Scribd company logo
5.3 Separating program
description from evaluation
AMoAd network ?土井健司
関?心の分離離
(separation of concerns)
! ? 前節での関?心の分離離の例例
! ? 第?一級関数が受け取った引数を?一回ずつ実?行行
! ? エラーハンドリングにOptionを利利?用
! ? Streamでの分離離
! ? 実際に必要になるまで処理理を実施しない
! ? 遅延の利利?用
※ ?第?一級関数:関数型
exists関数(基本実装)
def exists(p: A => Boolean): Boolean =
? uncons match {
? ? ? case Some(c) => p(c.head) || c.tail.exists(p)
? ? ? case None => false
? }
! ? || は左辺がtrueの場合右辺を評価しない
! ? tailはlazy valにより、いかなるコードも遅延評価
exists関数(foldRight)
def foldRight[B](z: => B)(f: (A, => B) => B): B =
? uncons match {
? ? ? case Some(c) => f(c.head, c.tail.foldRight(z)(f))
? ? ? case None => z
? }
def exists(p: A => Boolean): Boolean =
? foldRight(false)((a, b) => p(a) || b)
! ? fは第2引数に対し正格評価ではない
! ? これにより、existsをfoldRightを使って実装可能
EXCERCISE
1.? Stream(1,2,3,4).map(_ + 10)...
2.? cons(11, Stream(2,3,4).map(_ + 10))...
3.? Stream(2,3,4).map(_ + 10)...
4.? cons(12, Stream(3,4).map(_ + 10))...
5.? 12 :: Stream(3,4).map(_ + 10)...
6.? ...
遅延評価順序
遅延評価順序
! ? 以降降、補?足的に処理理イメージを記載。
! ? 厳密に記述が困難なためあくまで「イメージ」
1.  ?Stream(1, 2, 3, 4)...
2. cons(1.map(_ + 10)..., Stream(2,3,4).map...
1.5 Stream(1, 2, 3, 4).apply(_.head, _.tail: _*)...
遅延評価順序(1 -> 2)
2. cons(1.map(_ + 10)..., Stream(2,3,4)...
3. Stream(2,3,4).map(_ + 10)...
2.5 (1 + 10 ) % 2 => [FILTERED]
遅延評価順序(2 -> 3)
3. Stream(2,3,4).map(_ + 10)...
4. cons(2.map(_ + 10)..., Stream(3,4).map...
3.5 Stream(2, 3, 4).apply(_.head, _.tail: _*)...
遅延評価順序(3 -> 4)
4. cons(2.map(_ + 10)..., Stream(3,4).map...
5. 12 :: Stream(3,4).map(_ + 10)...
4.5 (2 + 10) % 2 => [OK]
遅延評価順序(4 -> 5)
後続処理理の省省略略(find)
def find(p: A => Boolean): Option[A] =
? filter(p).uncons.map(_._1)
! ? 発?見見し次第、終了了する
遅延評価のメモリ効率率率
! ? 中間ストリームを?生成しない
! ? 現?行行エレメントの変換と補完に必要なメモリのみでOK
! ? Stream(1, 2, 3, 4).map(_ + 10).filter(_ % 2 == 0)の場合
! ? 1, 3はfilter後にはガベージコレクション可能

More Related Content

Chapter5.3

  • 1. 5.3 Separating program description from evaluation AMoAd network ?土井健司
  • 2. 関?心の分離離 (separation of concerns) ! ? 前節での関?心の分離離の例例 ! ? 第?一級関数が受け取った引数を?一回ずつ実?行行 ! ? エラーハンドリングにOptionを利利?用 ! ? Streamでの分離離 ! ? 実際に必要になるまで処理理を実施しない ! ? 遅延の利利?用 ※ ?第?一級関数:関数型
  • 3. exists関数(基本実装) def exists(p: A => Boolean): Boolean = ? uncons match { ? ? ? case Some(c) => p(c.head) || c.tail.exists(p) ? ? ? case None => false ? } ! ? || は左辺がtrueの場合右辺を評価しない ! ? tailはlazy valにより、いかなるコードも遅延評価
  • 4. exists関数(foldRight) def foldRight[B](z: => B)(f: (A, => B) => B): B = ? uncons match { ? ? ? case Some(c) => f(c.head, c.tail.foldRight(z)(f)) ? ? ? case None => z ? } def exists(p: A => Boolean): Boolean = ? foldRight(false)((a, b) => p(a) || b) ! ? fは第2引数に対し正格評価ではない ! ? これにより、existsをfoldRightを使って実装可能
  • 6. 1.? Stream(1,2,3,4).map(_ + 10)... 2.? cons(11, Stream(2,3,4).map(_ + 10))... 3.? Stream(2,3,4).map(_ + 10)... 4.? cons(12, Stream(3,4).map(_ + 10))... 5.? 12 :: Stream(3,4).map(_ + 10)... 6.? ... 遅延評価順序
  • 7. 遅延評価順序 ! ? 以降降、補?足的に処理理イメージを記載。 ! ? 厳密に記述が困難なためあくまで「イメージ」
  • 8. 1. ?Stream(1, 2, 3, 4)... 2. cons(1.map(_ + 10)..., Stream(2,3,4).map... 1.5 Stream(1, 2, 3, 4).apply(_.head, _.tail: _*)... 遅延評価順序(1 -> 2)
  • 9. 2. cons(1.map(_ + 10)..., Stream(2,3,4)... 3. Stream(2,3,4).map(_ + 10)... 2.5 (1 + 10 ) % 2 => [FILTERED] 遅延評価順序(2 -> 3)
  • 10. 3. Stream(2,3,4).map(_ + 10)... 4. cons(2.map(_ + 10)..., Stream(3,4).map... 3.5 Stream(2, 3, 4).apply(_.head, _.tail: _*)... 遅延評価順序(3 -> 4)
  • 11. 4. cons(2.map(_ + 10)..., Stream(3,4).map... 5. 12 :: Stream(3,4).map(_ + 10)... 4.5 (2 + 10) % 2 => [OK] 遅延評価順序(4 -> 5)
  • 12. 後続処理理の省省略略(find) def find(p: A => Boolean): Option[A] = ? filter(p).uncons.map(_._1) ! ? 発?見見し次第、終了了する
  • 13. 遅延評価のメモリ効率率率 ! ? 中間ストリームを?生成しない ! ? 現?行行エレメントの変換と補完に必要なメモリのみでOK ! ? Stream(1, 2, 3, 4).map(_ + 10).filter(_ % 2 == 0)の場合 ! ? 1, 3はfilter後にはガベージコレクション可能