SlideShare a Scribd company logo
1 of 37
Download to read offline
Monadicプログラミング
マニアックス
2012年年8⽉月18⽇日
浅海智晴
活動
関連サイト
•  Modegramming Style (テキストDSL駆動開発を
   テーマにしたブログ)
   •  http://modegramming.blogspot.com/
•  SimpleModeler
   •  http://github.com/asami/simplemodeler/
•  SmartDox
   •  http://github.com/asami/smartdox
•  g3フレームワーク
   •  http://code.google.com/p/goldenport3/
•  g4フレームワーク
   •  http://github.com/asami/goldenport-android-
      library/
⽂文脈
アジェンダ
Monadicプログラミングで
やりたいこと


 関数型プログラミング



   Monadicプログラミング
関連記事
•  Modegramming Style
  •  http://modegramming.blogspot.jp/
•  クラウド温泉3.0@⼩小樽〜~
     クラウド温泉3.0 (18) / Promise
諸元
•  スライド
 •  Scala 2.9.2
 •  Scalaz 6.0.4
•  最新
 •  Scala 2.10.0 M6
 •  Scalaz 7 開発中 (2012年年4⽉月リリース予定?)
•  Scala 2.10で並列列プログラミング周りが⼤大幅に変更更され
   る予定
 •  Akka(Actor)、STM、Future/Promise
 •  Scala 2.10 + Scalaz7で新しいバランスになるので、⾒見見極
    めが必要
新しい現実
ハードウェア

•  メニーコア、⼤大容量量メモリ、SSD
•  インメモリデータベース
•  並列列プログラミング

クラウド・プラットフォーム

•    クラウド・サービス、スマート・デバイス
•    故障、遅延
•    ⼤大規模データ、⼤大規模演算
•    ⾼高頻度度イベント
•    ⾮非同期、並列列、分散
•    NoSQL
アプリケーションの階層と役割

アプリケー   •  DSLの作法に従ってビジネスロ
           ジックを記述
 ション    •  OO、関数型のスキルは最低限


        •  フレームワークを簡単に使⽤用する
 DSL       ための専⽤用⾔言語
        •  OO、関数型の⾼高度度なスキル


フレーム    •  ドメインの共通処理理を記述
 ワーク    •  OO、関数型の⾼高度度なスキル
⽤用語
•  セッション内でのローカルな⽤用法

•  (普通の)オブジェクト指向⾔言語
 •  Java的なオブジェクト指向⾔言語。オブジェクト+クラス+
    抽象データ型+静的型付け+⼿手続き+値。
•  本物のオブジェクト指向⾔言語
 •  オブジェクトとメッセージから構成される核に何かを加え
    たもの。
•  関数型⾔言語
 •  純粋関数型⾔言語(での利利⽤用も可能)
   •  イミュータブル、参照透過性
 •  モナドが⼀一級市⺠民
 •  型クラス(相当)
Monadicプログラミングで
やりたいこと
Monadicプログラミングで
やりたいこと
•  定義
 •  普通
    •  Monadを使ったプログラミング。
 •  本セッションでの広い意味
    •  Monadを中⼼心としつつも、旧来からあるFunctorによるプログ
       ラミング、関数合成、コンビネータなども包含しつつ、パイプ
       ライン・プログラミングのスタイルとしてまとめたもの。
•  やりたいこと
 •  楽々プログラミング
 •  並列列プログラミング
 •  DSL
楽々プログラミング
def main(args: Array[String]) {
   records |> build部⾨門  >>> buildTree >>> showTree
 }

def build部⾨門(records: Seq[Map[Symbol, Any]]): Map[Int, 部⾨門] = {
  records.foldRight(Map[Int, 部⾨門]())((x, a) => {
    val 部⾨門ID = x('部⾨門ID).asInstanceOf[Int]
    val 部⾨門名  = x('部⾨門名).asInstanceOf[String]
    val 親部⾨門ID = x('親部⾨門ID).asInstanceOf[Option[Int]]
    val 親部⾨門名  = x.get('親部⾨門名).asInstanceOf[Option[String]]
    a + (部⾨門ID -> 部⾨門(部⾨門ID, 部⾨門名, 親部⾨門ID, 親部⾨門名))
  })
}

def buildTree(sections: Map[Int, 部⾨門]): Tree[部⾨門] = {
  def build(sec: 部⾨門): Tree[部⾨門] = {
    val children = sections collect {
      case (k, v) if v.親部⾨門ID == sec.部⾨門ID.some => v
    }
    node(sec, children.toStream.sortBy(_.部⾨門ID).map(build))
  }
  build(sections(1))
}

def showTree(tree: Tree[部⾨門]) {
  println(tree.drawTree(showA[部⾨門]))
}
 val records = List(Map('部⾨門ID -> 1,
                  '部⾨門名  -> "営業統括",       Map('部⾨門ID -> 121,
                  '親部⾨門ID -> None,          '部⾨門名  -> "近畿⽀支店",
                  '親部⾨門名  -> None),         '親部⾨門ID -> Some(12),
               Map('部⾨門ID -> 11,            '親部⾨門名  -> "⻄西⽇日本統括"),
                  '部⾨門名  -> "東⽇日本統括",     Map('部⾨門ID -> 122,
                  '親部⾨門ID -> Some(1),       '部⾨門名  -> "中国⽀支店",
                  '親部⾨門名  -> "営業統括"),       '親部⾨門ID -> Some(12),
               Map('部⾨門ID -> 12,            '親部⾨門名  -> "⻄西⽇日本統括"),
                  '部⾨門名  -> "⻄西⽇日本統括",    Map('部⾨門ID -> 123,
                  '親部⾨門ID -> Some(1),       '部⾨門名  -> "四国⽀支店",
                  '親部⾨門名  -> "営業統括"),       '親部⾨門ID -> Some(12),
               Map('部⾨門ID -> 13,            '親部⾨門名  -> "⻄西⽇日本統括"),
                  '部⾨門名  -> "⾸首都圏統括",     Map('部⾨門ID -> 124,
                  '親部⾨門ID -> Some(1),       '部⾨門名  -> "九州⽀支店",
                  '親部⾨門名  -> "営業統括"),       '親部⾨門ID -> Some(12),
               Map('部⾨門ID -> 111,           '親部⾨門名  -> "⻄西⽇日本統括"),
                  '部⾨門名  -> "北北海道⽀支店",    Map('部⾨門ID -> 125,
                  '親部⾨門ID -> Some(11),      '部⾨門名  -> "沖縄⽀支店",
                  '親部⾨門名  -> "東⽇日本統括"),     '親部⾨門ID -> Some(12),
               Map('部⾨門ID -> 112,           '親部⾨門名  -> "⻄西⽇日本統括"),
                  '部⾨門名  -> "東北北⽀支店",     Map('部⾨門ID -> 131,
                  '親部⾨門ID -> Some(11),      '部⾨門名  -> "東京⽀支店",
                  '親部⾨門名  -> "東⽇日本統括"),     '親部⾨門ID -> Some(13),
               Map('部⾨門ID -> 113,           '親部⾨門名  -> "⾸首都圏統括"),
                  '部⾨門名  -> "北北陸陸⽀支店",    Map('部⾨門ID -> 132,
                  '親部⾨門ID -> Some(11),      '部⾨門名  -> "北北関東⽀支店",
                  '親部⾨門名  -> "東⽇日本統括"),     '親部⾨門ID -> Some(13),
               Map('部⾨門ID -> 114,           '親部⾨門名  -> "⾸首都圏統括"),
                  '部⾨門名  -> "中部⽀支店",      Map('部⾨門ID -> 133,
                  '親部⾨門ID -> Some(11),      '部⾨門名  -> "南関東⽀支店",
                  '親部⾨門名  -> "東⽇日本統括"),     '親部⾨門ID -> Some(13),
                                            '親部⾨門名  -> "⾸首都圏統括"))
部⾨門(1,営業統括,None,Some(None))
|
+- 部⾨門(11,東⽇日本統括,Some(1),Some(営業統括))
| |
| +- 部⾨門(111,北北海道⽀支店,Some(11),Some(東⽇日本統括))
| |
| +- 部⾨門(112,東北北⽀支店,Some(11),Some(東⽇日本統括))
| |
| +- 部⾨門(113,北北陸陸⽀支店,Some(11),Some(東⽇日本統括))
| |
| `- 部⾨門(114,中部⽀支店,Some(11),Some(東⽇日本統括))
|
+- 部⾨門(12,⻄西⽇日本統括,Some(1),Some(営業統括))
| |
| +- 部⾨門(121,近畿⽀支店,Some(12),Some(⻄西⽇日本統括))
| |
| +- 部⾨門(122,中国⽀支店,Some(12),Some(⻄西⽇日本統括))
| |
| +- 部⾨門(123,四国⽀支店,Some(12),Some(⻄西⽇日本統括))
| |
| +- 部⾨門(124,九州⽀支店,Some(12),Some(⻄西⽇日本統括))
| |
| `- 部⾨門(125,沖縄⽀支店,Some(12),Some(⻄西⽇日本統括))
|
`- 部⾨門(13,⾸首都圏統括,Some(1),Some(営業統括))
   |
   +- 部⾨門(131,東京⽀支店,Some(13),Some(⾸首都圏統括))
   |
   +- 部⾨門(132,北北関東⽀支店,Some(13),Some(⾸首都圏統括))
   |
   `- 部⾨門(133,南関東⽀支店,Some(13),Some(⾸首都圏統括))
並列列プログラミング
 準備

 時間を測る関数                                 テスト関数

def go[T](a: => T): (T, Long) = {
  val start = System.currentTimeMillis   val f = (x: Int) => {
  val r = a                                Thread.sleep(x * 100)
  val end = System.currentTimeMillis       x
  (r, end - start)                       }
}




scala> go(f(10))                         scala> go {
res176: (Int, Long) = (10,1000)             | f(10)
                                            |}
                                         res253: (Int, Long) = (10,1001)
PromiseのKleisli


scala> val fp = f.promise
fp: scalaz.Kleisli[scalaz.concurrent.Promise,Int,Int] =
scalaz.Kleislis$$anon$1@9edaab8




 Applicative


scala> go((fp(1) |@| fp(2) |@| fp(3))(_ + _ + _).get)
res215: (Int, Long) = (6,302)



                                                    scala> go(f(1) + f(2) + f(3))
                                                    res212: (Int, Long) = (6,603)




            scala> go((1.some |@| 2.some |@| 3.some)(_ + _ + _).get)
            res237: (Int, Long) = (6,1)
scala> go(List(1, 2, 3).map(fp).map(_.flatMap(fp)).sequence.get)
res220: (List[Int], Long) = (List(1, 2, 3),602)




                              scala> go(List(1, 2, 3).map(f).map(f))
                              res221: (List[Int], Long) = (List(1, 2, 3),1205)


  テスト関数

  val fx = (x: Int) => {
    val t = math.abs(x - 4)
    Thread.sleep(t * 100)
    x
  }

  val fxp = fx.promise
scala> go(List(1, 2, 3).map(fp).map(_.flatMap(fxp)).sequence.get)
res222: (List[Int], Long) = (List(1, 2, 3),402)




                                     scala> go(List(1, 2, 3).map(f).map(fx))
                                     res223: (List[Int], Long) = (List(1, 2, 3),1205)




scala> go(List(1, 2, 3).map(fp >=> fxp).sequence.get)
res230: (List[Int], Long) = (List(1, 2, 3),402)




                                     scala> go(List(1, 2, 3).map(f >>> fx))
                                     res232: (List[Int], Long) = (List(1, 2, 3),1205)
DSL
import org.goldenport.dataflow._

val z = for (i <- table('T⽣生産実績)) yield {
  val x = i.sum('原価) + 10
  val y = i.masterJoin('M部⾨門)((x, y) => x('部⾨門Id) == y('部⾨門Id) and x('製品Id) == y('製品Id))
  val z = y.update('NEW_GENKA, x)
  val zz = z.where(x => x('部⾨門Id) == 1)
  val zzz = zz.record(SymbolFieldDef('A), SymbolFieldDef('B))
  zzz
}
println(”SQL = " + z.toSql.toText)




SQL = select sum(原価) + 10 as NEW_GENKA, A, B
from T⽣生産実績
left outer join M部⾨門  on (T⽣生産実績.部⾨門Id = M部⾨門.部⾨門Id) and (T⽣生産実績.製品Id = M部⾨門.
製品Id)
Where T⽣生産実績.部⾨門Id = 1
関数型プログラミング
代数的データ型
  •  Algebraic data type
  •  直積の直和の総和
  •  再帰構造

ケースクラスで直積を実現
case class Person(name: String, age: Int)
Case class Company(name: String, phone: String)


Eitherで直積の直和を実現
Either[Person, Company]


sealedトレイトで直積の直和の総和を実現

sealed trait Party
case class Person(name: String, age: Int) extends Party
case class Company(name: String, phone: String) extends Party
永続データ構造
•  Persistent data structure
•  変更更される際に変更更前のバージョンを常に保持するデータ構造で
   ある。このようなデータ構造は、更更新の際に元のデータ構造を書
   き換えるのではなく、新たなデータ構造を⽣生成すると考えられ、
   イミュータブルなデータ構造の構築に利利⽤用可能である(Wikipedia)
代数的構造デザインパターン
結合律律 (associative law)

•  半群 (semigroup)
•  モノイド  (monoid)         (a + b) + c = a + (b + c)
•  群 (group)

可換律律 (commutative law)

•  可換半群
•  可換モノイド                       a+b=b+a
•  可換群(アーベル群)

分配律律 (distributive law)

•  環  (ring)
•  体 (field)              a * (b + c) = a * b + a * c
圏論論デザインパターン

                         圏  (category)
          モナド            • Hask圏 (Scala圏?)
         (monad)         • クライスリ圏  
                          (kleisli category)




   Applicative                     射 (arrow,
    functor                        morphism)




                      関⼿手  
                   (functor)
並列列プログラミング
•  マルチスレッド  
   •  共有状態 (shared mutability)
   •  共有状態をロック ← 伝統的⽅方法
   •  STM (Software Transactional Memory)
•  アクター
   •  状態をアクターローカル(スレッドローカル)にする (isolating
      mutability)
   •  不不変オブジェクトによるメッセージで通信
•  関数プログラミング⽅方式
   •  代数的データ型、永続データ構造
   •  ⇒ 参照透過性、不不変オブジェクト
 •  状態変更更ではなく、状態変更更命令令書を計算
   •  イメージとしてはSQLの⽂文字列列を計算して作成する感じ
 •  モナドのメカニズムを使って並列列処理理(+状態変更更命令令書)を
    隠蔽
トピックス
•  Monad
  •  http://modegramming.blogspot.jp/2012/08/30-13-
     monad.html
•  Monoid
  •  http://modegramming.blogspot.jp/2012/08/30-12-
     monoid.html
•  Fold
  •  http://modegramming.blogspot.jp/2012/07/30-10-
     map-filter-fold.html
Monadicプログラミングの効⽤用
 Java⾵風
def validate(name: String, age: Int): ValidationNEL[Throwable, (String,
Int)] = {!
   val a = validateName(name) !
   val b = validateAge(age) !
   if (a.isSuccess && b.isSuccess) { !
     val a1 = a.asInstanceOf[Success[NonEmptyList[Throwable], String]].a   !
     val b1 = b.asInstanceOf[Success[NonEmptyList[Throwable], Int]].a !
     Success((a1, b1)) !
   } else if (a.isSuccess) { !
     b.asInstanceOf[Failure[NonEmptyList[Throwable], (String, Int)]] !
   } else if (b.isSuccess) { !
     a.asInstanceOf[Failure[NonEmptyList[Throwable], (String, Int)]] !
   } else { !
     val a1 = a.asInstanceOf[Failure[NonEmptyList[Throwable], String]].e   !
     val b1 = b.asInstanceOf[Failure[NonEmptyList[Throwable], Int]].e !
     Failure(a1 |+| b1) !
   } !
}!
Scala (関数型プログラミング)
def validate(name: String, age: Int):
ValidationNEL[Throwable, (String, Int)] = { !
  validateName(name) match { !
    case Success(a) => validateAge(age) match { !
      case Success(b) => Success((a, b)) !
      case Failure(e) => Failure(e) !
    } !
    case Failure(e1) => validateAge(age) match { !
      case Success(b) => Failure(e1) !
      case Failure(e2) => Failure(e1 |+| e2) !
    } !
  } !
} !


Scalaz (Monadicプログラミング)
def validate(name: String, age: Int):
ValidationNEL[Throwable, (String, Int)] = { !
   (validateName(name) ⊛ validateAge(age))((_, _))   !
}!


URL: http://modegramming.blogspot.jp/2012/04/
     scala-tips-validation-10-applicative.html
Monadicプログラミング
Arrowを⽤用いたデーターフロー
関数合成
モナドによる計算⽂文脈 (1)
モナドによる計算⽂文脈 (2)
パイプラインの構成部品
メソッド      メソッド動作        動作イメージ      コンテナ型   要素型     要素数

map       コンテナ内の要素に     M[A]→M[B]   変わらない   変わる     同じ
          関数を適⽤用して新し
          いコンテナに詰め直
          す。
filter    コンテナ内の要素を     M[A]→M[A]   変わらない   変わらない   同じ/減る
          選別して新しコンテ
          ナに詰め直す。
fold      コンテナをまるごと     M[A]→N      変わる     N/A     N/A
          別のオブジェクトに
          変換する。
reduce    コンテナの内容を⼀一    M[A]→A      変わる     N/A     N/A
          つにまとめる。
collect   コンテナ内の要素に     M[A]→M[B]   変わらない   変わる     同じ/減る
          部分関数を適⽤用して
          選択と変換を⾏行行う。
flatMap   コンテナ内の要素ご     M[A]→M[B]   変わらない   変わる     同じ/増える/減
          とにコンテナを作成                                 る
          する関数を適⽤用し最
          後に⼀一つのコンテナ
          にまとめる。
まとめ
•  Monadicプログラミングの狙い
 •  楽々プログラミング
 •  並列列プログラミング
 •  DSL
      •  データフロー
•  関数型プログラミング
 •    ⼀一昔前の関数型プログラミングとは別物
 •    A→B、A→M[B]の関数が基本
 •    モナド、モノイド
 •    型クラス
•  Monadicプログラミング
 •  パイプラインで考えると関数型にアプローチしやすい
 •  データフローで業務モデルと繋げたい
END

More Related Content

What's hot

Algorithm 速いアルゴリズムを書くための基礎
Algorithm 速いアルゴリズムを書くための基礎Algorithm 速いアルゴリズムを書くための基礎
Algorithm 速いアルゴリズムを書くための基礎Kenji Otsuka
 
函数プログラミングの エッセンスと考え方
函数プログラミングのエッセンスと考え方函数プログラミングのエッセンスと考え方
函数プログラミングの エッセンスと考え方啓 小笠原
 
Granger因果による 時系列データの因果推定(因果フェス2015)
Granger因果による時系列データの因果推定(因果フェス2015)Granger因果による時系列データの因果推定(因果フェス2015)
Granger因果による 時系列データの因果推定(因果フェス2015)Takashi J OZAKI
 
Chapter 6: Computing on the language (R Language Definition)
Chapter 6: Computing on the language (R Language Definition)Chapter 6: Computing on the language (R Language Definition)
Chapter 6: Computing on the language (R Language Definition)Nagi Teramo
 
Boost.PropertyMap (.pptx)
Boost.PropertyMap (.pptx)Boost.PropertyMap (.pptx)
Boost.PropertyMap (.pptx)Cryolite
 
Boost.PropertyMap (.pdf)
Boost.PropertyMap (.pdf)Boost.PropertyMap (.pdf)
Boost.PropertyMap (.pdf)Cryolite
 
AngularJSでデータビジュアライゼーションがしたい
AngularJSでデータビジュアライゼーションがしたいAngularJSでデータビジュアライゼーションがしたい
AngularJSでデータビジュアライゼーションがしたいYosuke Onoue
 
Hive/Pigを使ったKDD'12 track2の広告クリック率予測
Hive/Pigを使ったKDD'12 track2の広告クリック率予測Hive/Pigを使ったKDD'12 track2の広告クリック率予測
Hive/Pigを使ったKDD'12 track2の広告クリック率予測Makoto Yui
 
三角関係になったときの対処法
三角関係になったときの対処法三角関係になったときの対処法
三角関係になったときの対処法Yachiyo Suzuki
 
Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料時響 逢坂
 
Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術Naoki Aoyama
 
d3jsハンズオン @E2D3ハッカソン
d3jsハンズオン @E2D3ハッカソンd3jsハンズオン @E2D3ハッカソン
d3jsハンズオン @E2D3ハッカソン圭輔 大曽根
 
20141128 iOSチーム勉強会 My Sweet Swift
20141128 iOSチーム勉強会 My Sweet Swift20141128 iOSチーム勉強会 My Sweet Swift
20141128 iOSチーム勉強会 My Sweet Swiftnecocen
 
今から始める Lens/Prism
今から始める Lens/Prism今から始める Lens/Prism
今から始める Lens/PrismNaoki Aoyama
 
[機械学習]文章のクラス分類
[機械学習]文章のクラス分類[機械学習]文章のクラス分類
[機械学習]文章のクラス分類Tetsuya Hasegawa
 
Halide による画像処理プログラミング入門
Halide による画像処理プログラミング入門Halide による画像処理プログラミング入門
Halide による画像処理プログラミング入門Fixstars Corporation
 
Van laarhoven lens
Van laarhoven lensVan laarhoven lens
Van laarhoven lensNaoki Aoyama
 

What's hot (20)

Python opt
Python optPython opt
Python opt
 
Algorithm 速いアルゴリズムを書くための基礎
Algorithm 速いアルゴリズムを書くための基礎Algorithm 速いアルゴリズムを書くための基礎
Algorithm 速いアルゴリズムを書くための基礎
 
函数プログラミングの エッセンスと考え方
函数プログラミングのエッセンスと考え方函数プログラミングのエッセンスと考え方
函数プログラミングの エッセンスと考え方
 
Granger因果による 時系列データの因果推定(因果フェス2015)
Granger因果による時系列データの因果推定(因果フェス2015)Granger因果による時系列データの因果推定(因果フェス2015)
Granger因果による 時系列データの因果推定(因果フェス2015)
 
Chapter 6: Computing on the language (R Language Definition)
Chapter 6: Computing on the language (R Language Definition)Chapter 6: Computing on the language (R Language Definition)
Chapter 6: Computing on the language (R Language Definition)
 
Boost.PropertyMap (.pptx)
Boost.PropertyMap (.pptx)Boost.PropertyMap (.pptx)
Boost.PropertyMap (.pptx)
 
Boost.PropertyMap (.pdf)
Boost.PropertyMap (.pdf)Boost.PropertyMap (.pdf)
Boost.PropertyMap (.pdf)
 
機械学習
機械学習機械学習
機械学習
 
AngularJSでデータビジュアライゼーションがしたい
AngularJSでデータビジュアライゼーションがしたいAngularJSでデータビジュアライゼーションがしたい
AngularJSでデータビジュアライゼーションがしたい
 
Hive/Pigを使ったKDD'12 track2の広告クリック率予測
Hive/Pigを使ったKDD'12 track2の広告クリック率予測Hive/Pigを使ったKDD'12 track2の広告クリック率予測
Hive/Pigを使ったKDD'12 track2の広告クリック率予測
 
Gorinphp0729
Gorinphp0729Gorinphp0729
Gorinphp0729
 
三角関係になったときの対処法
三角関係になったときの対処法三角関係になったときの対処法
三角関係になったときの対処法
 
Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料
 
Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術
 
d3jsハンズオン @E2D3ハッカソン
d3jsハンズオン @E2D3ハッカソンd3jsハンズオン @E2D3ハッカソン
d3jsハンズオン @E2D3ハッカソン
 
20141128 iOSチーム勉強会 My Sweet Swift
20141128 iOSチーム勉強会 My Sweet Swift20141128 iOSチーム勉強会 My Sweet Swift
20141128 iOSチーム勉強会 My Sweet Swift
 
今から始める Lens/Prism
今から始める Lens/Prism今から始める Lens/Prism
今から始める Lens/Prism
 
[機械学習]文章のクラス分類
[機械学習]文章のクラス分類[機械学習]文章のクラス分類
[機械学習]文章のクラス分類
 
Halide による画像処理プログラミング入門
Halide による画像処理プログラミング入門Halide による画像処理プログラミング入門
Halide による画像処理プログラミング入門
 
Van laarhoven lens
Van laarhoven lensVan laarhoven lens
Van laarhoven lens
 

Viewers also liked

モデリングの未来 〜~パネルディスカッション
モデリングの未来 〜~パネルディスカッションモデリングの未来 〜~パネルディスカッション
モデリングの未来 〜~パネルディスカッションTomoharu ASAMI
 
Object-Funcational Analysis and design
Object-Funcational Analysis and designObject-Funcational Analysis and design
Object-Funcational Analysis and designTomoharu ASAMI
 
楽々Scalaプログラミング
楽々Scalaプログラミング楽々Scalaプログラミング
楽々ScalaプログラミングTomoharu ASAMI
 
Prologで構文解析という昔話
Prologで構文解析という昔話Prologで構文解析という昔話
Prologで構文解析という昔話宏明 塩原
 
RDSDataSource: App Thinning
RDSDataSource: App ThinningRDSDataSource: App Thinning
RDSDataSource: App ThinningRAMBLER&Co
 
Object-Functional Analysis and Design and Programming温泉
Object-Functional Analysis and Design and Programming温泉Object-Functional Analysis and Design and Programming温泉
Object-Functional Analysis and Design and Programming温泉Tomoharu ASAMI
 
MindmapModelingチュートリアル
MindmapModelingチュートリアルMindmapModelingチュートリアル
MindmapModelingチュートリアルTomoharu ASAMI
 
オブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional Programmingオブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional ProgrammingTomoharu ASAMI
 
Scalaプログラミング・マニアックス
Scalaプログラミング・マニアックスScalaプログラミング・マニアックス
Scalaプログラミング・マニアックスTomoharu ASAMI
 
実務者のためのかんたんScalaz
実務者のためのかんたんScalaz実務者のためのかんたんScalaz
実務者のためのかんたんScalazTomoharu ASAMI
 
Prefer Cloud Platform - ビジョン、アーキテクチャ
Prefer Cloud Platform - ビジョン、アーキテクチャPrefer Cloud Platform - ビジョン、アーキテクチャ
Prefer Cloud Platform - ビジョン、アーキテクチャTomoharu ASAMI
 
Monadic Programmingのススメ - Functional Reactive Programmingへのアプローチ
Monadic Programmingのススメ - Functional Reactive ProgrammingへのアプローチMonadic Programmingのススメ - Functional Reactive Programmingへのアプローチ
Monadic Programmingのススメ - Functional Reactive ProgrammingへのアプローチTomoharu ASAMI
 
リクルート式 自然言語処理技術の適応事例紹介
リクルート式 自然言語処理技術の適応事例紹介リクルート式 自然言語処理技術の適応事例紹介
リクルート式 自然言語処理技術の適応事例紹介Recruit Technologies
 
国内5000万人以上が利用するLINEを集客に活かせ! 50の成功例で学ぶ、LINE@でお店をPRする方法:山崎潤一郎先生
国内5000万人以上が利用するLINEを集客に活かせ! 50の成功例で学ぶ、LINE@でお店をPRする方法:山崎潤一郎先生国内5000万人以上が利用するLINEを集客に活かせ! 50の成功例で学ぶ、LINE@でお店をPRする方法:山崎潤一郎先生
国内5000万人以上が利用するLINEを集客に活かせ! 50の成功例で学ぶ、LINE@でお店をPRする方法:山崎潤一郎先生schoowebcampus
 
論文紹介 Semi-supervised Learning with Deep Generative Models
論文紹介 Semi-supervised Learning with Deep Generative Models論文紹介 Semi-supervised Learning with Deep Generative Models
論文紹介 Semi-supervised Learning with Deep Generative ModelsSeiya Tokui
 
深層学習時代の自然言語処理
深層学習時代の自然言語処理深層学習時代の自然言語処理
深層学習時代の自然言語処理Yuya Unno
 

Viewers also liked (17)

モデリングの未来 〜~パネルディスカッション
モデリングの未来 〜~パネルディスカッションモデリングの未来 〜~パネルディスカッション
モデリングの未来 〜~パネルディスカッション
 
Object-Funcational Analysis and design
Object-Funcational Analysis and designObject-Funcational Analysis and design
Object-Funcational Analysis and design
 
楽々Scalaプログラミング
楽々Scalaプログラミング楽々Scalaプログラミング
楽々Scalaプログラミング
 
Prologで構文解析という昔話
Prologで構文解析という昔話Prologで構文解析という昔話
Prologで構文解析という昔話
 
RDSDataSource: App Thinning
RDSDataSource: App ThinningRDSDataSource: App Thinning
RDSDataSource: App Thinning
 
Object-Functional Analysis and Design and Programming温泉
Object-Functional Analysis and Design and Programming温泉Object-Functional Analysis and Design and Programming温泉
Object-Functional Analysis and Design and Programming温泉
 
MindmapModelingチュートリアル
MindmapModelingチュートリアルMindmapModelingチュートリアル
MindmapModelingチュートリアル
 
オブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional Programmingオブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional Programming
 
Scalaプログラミング・マニアックス
Scalaプログラミング・マニアックスScalaプログラミング・マニアックス
Scalaプログラミング・マニアックス
 
Play勉強会 第3回
Play勉強会 第3回Play勉強会 第3回
Play勉強会 第3回
 
実務者のためのかんたんScalaz
実務者のためのかんたんScalaz実務者のためのかんたんScalaz
実務者のためのかんたんScalaz
 
Prefer Cloud Platform - ビジョン、アーキテクチャ
Prefer Cloud Platform - ビジョン、アーキテクチャPrefer Cloud Platform - ビジョン、アーキテクチャ
Prefer Cloud Platform - ビジョン、アーキテクチャ
 
Monadic Programmingのススメ - Functional Reactive Programmingへのアプローチ
Monadic Programmingのススメ - Functional Reactive ProgrammingへのアプローチMonadic Programmingのススメ - Functional Reactive Programmingへのアプローチ
Monadic Programmingのススメ - Functional Reactive Programmingへのアプローチ
 
リクルート式 自然言語処理技術の適応事例紹介
リクルート式 自然言語処理技術の適応事例紹介リクルート式 自然言語処理技術の適応事例紹介
リクルート式 自然言語処理技術の適応事例紹介
 
国内5000万人以上が利用するLINEを集客に活かせ! 50の成功例で学ぶ、LINE@でお店をPRする方法:山崎潤一郎先生
国内5000万人以上が利用するLINEを集客に活かせ! 50の成功例で学ぶ、LINE@でお店をPRする方法:山崎潤一郎先生国内5000万人以上が利用するLINEを集客に活かせ! 50の成功例で学ぶ、LINE@でお店をPRする方法:山崎潤一郎先生
国内5000万人以上が利用するLINEを集客に活かせ! 50の成功例で学ぶ、LINE@でお店をPRする方法:山崎潤一郎先生
 
論文紹介 Semi-supervised Learning with Deep Generative Models
論文紹介 Semi-supervised Learning with Deep Generative Models論文紹介 Semi-supervised Learning with Deep Generative Models
論文紹介 Semi-supervised Learning with Deep Generative Models
 
深層学習時代の自然言語処理
深層学習時代の自然言語処理深層学習時代の自然言語処理
深層学習時代の自然言語処理
 

Similar to Monadicプログラミング マニアックス

Clojure programming-chapter-2
Clojure programming-chapter-2Clojure programming-chapter-2
Clojure programming-chapter-2Masao Kato
 
F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~Nobuhisa Koizumi
 
R入門とgoogle map +α
R入門とgoogle map +αR入門とgoogle map +α
R入門とgoogle map +αkobexr
 
RでGISハンズオンセッション
RでGISハンズオンセッションRでGISハンズオンセッション
RでGISハンズオンセッションarctic_tern265
 
Ruby科学データ処理ツールの開発 NArrayとPwrake
Ruby科学データ処理ツールの開発 NArrayとPwrakeRuby科学データ処理ツールの開発 NArrayとPwrake
Ruby科学データ処理ツールの開発 NArrayとPwrakeMasahiro Tanaka
 
R's anti sparseness
R's anti sparsenessR's anti sparseness
R's anti sparsenessybenjo
 
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013Ryo Sakamoto
 
メンテできないコードをメンテする技術
メンテできないコードをメンテする技術メンテできないコードをメンテする技術
メンテできないコードをメンテする技術Tomoya Ishida
 
20170923 excelユーザーのためのr入門
20170923 excelユーザーのためのr入門20170923 excelユーザーのためのr入門
20170923 excelユーザーのためのr入門Takashi Kitano
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門Hideyuki Tanaka
 
つくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタつくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタ京大 マイコンクラブ
 
C++11概要 ライブラリ編
C++11概要 ライブラリ編C++11概要 ライブラリ編
C++11概要 ライブラリ編egtra
 
textsearch_jaで全文検索
textsearch_jaで全文検索textsearch_jaで全文検索
textsearch_jaで全文検索Akio Ishida
 
K010 appstat201201
K010 appstat201201K010 appstat201201
K010 appstat201201t2tarumi
 
動的計画法入門(An introduction to Dynamic Programming)
動的計画法入門(An introduction to Dynamic Programming)動的計画法入門(An introduction to Dynamic Programming)
動的計画法入門(An introduction to Dynamic Programming)kakira9618
 
動的計画法の並列化
動的計画法の並列化動的計画法の並列化
動的計画法の並列化Proktmr
 

Similar to Monadicプログラミング マニアックス (20)

Clojure programming-chapter-2
Clojure programming-chapter-2Clojure programming-chapter-2
Clojure programming-chapter-2
 
F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~
 
Clojure
ClojureClojure
Clojure
 
R入門とgoogle map +α
R入門とgoogle map +αR入門とgoogle map +α
R入門とgoogle map +α
 
RでGISハンズオンセッション
RでGISハンズオンセッションRでGISハンズオンセッション
RでGISハンズオンセッション
 
Ruby科学データ処理ツールの開発 NArrayとPwrake
Ruby科学データ処理ツールの開発 NArrayとPwrakeRuby科学データ処理ツールの開発 NArrayとPwrake
Ruby科学データ処理ツールの開発 NArrayとPwrake
 
R's anti sparseness
R's anti sparsenessR's anti sparseness
R's anti sparseness
 
R language definition3.1_3.2
R language definition3.1_3.2R language definition3.1_3.2
R language definition3.1_3.2
 
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
 
メンテできないコードをメンテする技術
メンテできないコードをメンテする技術メンテできないコードをメンテする技術
メンテできないコードをメンテする技術
 
20170923 excelユーザーのためのr入門
20170923 excelユーザーのためのr入門20170923 excelユーザーのためのr入門
20170923 excelユーザーのためのr入門
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門
 
つくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタつくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタ
 
C++11概要 ライブラリ編
C++11概要 ライブラリ編C++11概要 ライブラリ編
C++11概要 ライブラリ編
 
Cocoa勉強会201208
Cocoa勉強会201208Cocoa勉強会201208
Cocoa勉強会201208
 
textsearch_jaで全文検索
textsearch_jaで全文検索textsearch_jaで全文検索
textsearch_jaで全文検索
 
K010 appstat201201
K010 appstat201201K010 appstat201201
K010 appstat201201
 
動的計画法入門(An introduction to Dynamic Programming)
動的計画法入門(An introduction to Dynamic Programming)動的計画法入門(An introduction to Dynamic Programming)
動的計画法入門(An introduction to Dynamic Programming)
 
Arctic.js
Arctic.jsArctic.js
Arctic.js
 
動的計画法の並列化
動的計画法の並列化動的計画法の並列化
動的計画法の並列化
 

More from Tomoharu ASAMI

アプリケーション・アーキテクチャ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第34回】
アプリケーション・アーキテクチャ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第34回】アプリケーション・アーキテクチャ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第34回】
アプリケーション・アーキテクチャ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第34回】Tomoharu ASAMI
 
テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第33回】
テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第33回】テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第33回】
テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第33回】Tomoharu ASAMI
 
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】Tomoharu ASAMI
 
実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】
実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】
実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】Tomoharu ASAMI
 
実装(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第30回】
実装(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第30回】実装(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第30回】
実装(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第30回】Tomoharu ASAMI
 
設計/UX/UI 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第29回】
設計/UX/UI 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第29回】設計/UX/UI 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第29回】
設計/UX/UI 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第29回】Tomoharu ASAMI
 
設計/原理 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第28回】
設計/原理 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第28回】設計/原理 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第28回】
設計/原理 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第28回】Tomoharu ASAMI
 
設計/ドメイン設計(5) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第27回】
設計/ドメイン設計(5) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第27回】設計/ドメイン設計(5) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第27回】
設計/ドメイン設計(5) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第27回】Tomoharu ASAMI
 
設計/ドメイン設計(4) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第26回】
設計/ドメイン設計(4) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第26回】設計/ドメイン設計(4) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第26回】
設計/ドメイン設計(4) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第26回】Tomoharu ASAMI
 
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】Tomoharu ASAMI
 
設計/ドメイン設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第24回】
設計/ドメイン設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第24回】設計/ドメイン設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第24回】
設計/ドメイン設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第24回】Tomoharu ASAMI
 
設計/ドメイン設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第23回】
設計/ドメイン設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第23回】設計/ドメイン設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第23回】
設計/ドメイン設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第23回】Tomoharu ASAMI
 
設計/コンポーネント設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第22回】
設計/コンポーネント設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第22回】設計/コンポーネント設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第22回】
設計/コンポーネント設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第22回】Tomoharu ASAMI
 
設計/コンポーネント設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第21回】
設計/コンポーネント設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第21回】設計/コンポーネント設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第21回】
設計/コンポーネント設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第21回】Tomoharu ASAMI
 
設計/コンポーネント設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第20回】
設計/コンポーネント設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第20回】設計/コンポーネント設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第20回】
設計/コンポーネント設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第20回】Tomoharu ASAMI
 
設計/アーキテクチャ設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第19回】
設計/アーキテクチャ設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第19回】設計/アーキテクチャ設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第19回】
設計/アーキテクチャ設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第19回】Tomoharu ASAMI
 
設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第18回】
設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第18回】設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第18回】
設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第18回】Tomoharu ASAMI
 
分析/イベント駆動 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第17回】
分析/イベント駆動 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第17回】分析/イベント駆動 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第17回】
分析/イベント駆動 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第17回】Tomoharu ASAMI
 
分析/コンポーネント分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第16回】
分析/コンポーネント分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第16回】分析/コンポーネント分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第16回】
分析/コンポーネント分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第16回】Tomoharu ASAMI
 
分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第15回】
分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第15回】分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第15回】
分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第15回】Tomoharu ASAMI
 

More from Tomoharu ASAMI (20)

アプリケーション・アーキテクチャ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第34回】
アプリケーション・アーキテクチャ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第34回】アプリケーション・アーキテクチャ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第34回】
アプリケーション・アーキテクチャ 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第34回】
 
テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第33回】
テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第33回】テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第33回】
テスト 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第33回】
 
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】
 
実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】
実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】
実装(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第31回】
 
実装(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第30回】
実装(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第30回】実装(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第30回】
実装(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第30回】
 
設計/UX/UI 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第29回】
設計/UX/UI 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第29回】設計/UX/UI 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第29回】
設計/UX/UI 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第29回】
 
設計/原理 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第28回】
設計/原理 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第28回】設計/原理 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第28回】
設計/原理 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第28回】
 
設計/ドメイン設計(5) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第27回】
設計/ドメイン設計(5) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第27回】設計/ドメイン設計(5) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第27回】
設計/ドメイン設計(5) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第27回】
 
設計/ドメイン設計(4) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第26回】
設計/ドメイン設計(4) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第26回】設計/ドメイン設計(4) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第26回】
設計/ドメイン設計(4) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第26回】
 
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
 
設計/ドメイン設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第24回】
設計/ドメイン設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第24回】設計/ドメイン設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第24回】
設計/ドメイン設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第24回】
 
設計/ドメイン設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第23回】
設計/ドメイン設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第23回】設計/ドメイン設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第23回】
設計/ドメイン設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第23回】
 
設計/コンポーネント設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第22回】
設計/コンポーネント設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第22回】設計/コンポーネント設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第22回】
設計/コンポーネント設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第22回】
 
設計/コンポーネント設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第21回】
設計/コンポーネント設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第21回】設計/コンポーネント設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第21回】
設計/コンポーネント設計(2) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第21回】
 
設計/コンポーネント設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第20回】
設計/コンポーネント設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第20回】設計/コンポーネント設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第20回】
設計/コンポーネント設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第20回】
 
設計/アーキテクチャ設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第19回】
設計/アーキテクチャ設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第19回】設計/アーキテクチャ設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第19回】
設計/アーキテクチャ設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第19回】
 
設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第18回】
設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第18回】設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第18回】
設計 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第18回】
 
分析/イベント駆動 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第17回】
分析/イベント駆動 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第17回】分析/イベント駆動 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第17回】
分析/イベント駆動 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第17回】
 
分析/コンポーネント分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第16回】
分析/コンポーネント分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第16回】分析/コンポーネント分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第16回】
分析/コンポーネント分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第16回】
 
分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第15回】
分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第15回】分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第15回】
分析 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第15回】
 

Recently uploaded

デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 

Recently uploaded (8)

デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 

Monadicプログラミング マニアックス

  • 3. 関連サイト •  Modegramming Style (テキストDSL駆動開発を テーマにしたブログ) •  http://modegramming.blogspot.com/ •  SimpleModeler •  http://github.com/asami/simplemodeler/ •  SmartDox •  http://github.com/asami/smartdox •  g3フレームワーク •  http://code.google.com/p/goldenport3/ •  g4フレームワーク •  http://github.com/asami/goldenport-android- library/
  • 6. 関連記事 •  Modegramming Style •  http://modegramming.blogspot.jp/ •  クラウド温泉3.0@⼩小樽〜~   クラウド温泉3.0 (18) / Promise
  • 7. 諸元 •  スライド •  Scala 2.9.2 •  Scalaz 6.0.4 •  最新 •  Scala 2.10.0 M6 •  Scalaz 7 開発中 (2012年年4⽉月リリース予定?) •  Scala 2.10で並列列プログラミング周りが⼤大幅に変更更され る予定 •  Akka(Actor)、STM、Future/Promise •  Scala 2.10 + Scalaz7で新しいバランスになるので、⾒見見極 めが必要
  • 8. 新しい現実 ハードウェア •  メニーコア、⼤大容量量メモリ、SSD •  インメモリデータベース •  並列列プログラミング クラウド・プラットフォーム •  クラウド・サービス、スマート・デバイス •  故障、遅延 •  ⼤大規模データ、⼤大規模演算 •  ⾼高頻度度イベント •  ⾮非同期、並列列、分散 •  NoSQL
  • 9. アプリケーションの階層と役割 アプリケー •  DSLの作法に従ってビジネスロ ジックを記述 ション •  OO、関数型のスキルは最低限 •  フレームワークを簡単に使⽤用する DSL ための専⽤用⾔言語 •  OO、関数型の⾼高度度なスキル フレーム •  ドメインの共通処理理を記述 ワーク •  OO、関数型の⾼高度度なスキル
  • 10. ⽤用語 •  セッション内でのローカルな⽤用法 •  (普通の)オブジェクト指向⾔言語 •  Java的なオブジェクト指向⾔言語。オブジェクト+クラス+ 抽象データ型+静的型付け+⼿手続き+値。 •  本物のオブジェクト指向⾔言語 •  オブジェクトとメッセージから構成される核に何かを加え たもの。 •  関数型⾔言語 •  純粋関数型⾔言語(での利利⽤用も可能) •  イミュータブル、参照透過性 •  モナドが⼀一級市⺠民 •  型クラス(相当)
  • 12. Monadicプログラミングで やりたいこと •  定義 •  普通 •  Monadを使ったプログラミング。 •  本セッションでの広い意味 •  Monadを中⼼心としつつも、旧来からあるFunctorによるプログ ラミング、関数合成、コンビネータなども包含しつつ、パイプ ライン・プログラミングのスタイルとしてまとめたもの。 •  やりたいこと •  楽々プログラミング •  並列列プログラミング •  DSL
  • 13. 楽々プログラミング def main(args: Array[String]) { records |> build部⾨門  >>> buildTree >>> showTree } def build部⾨門(records: Seq[Map[Symbol, Any]]): Map[Int, 部⾨門] = { records.foldRight(Map[Int, 部⾨門]())((x, a) => { val 部⾨門ID = x('部⾨門ID).asInstanceOf[Int] val 部⾨門名  = x('部⾨門名).asInstanceOf[String] val 親部⾨門ID = x('親部⾨門ID).asInstanceOf[Option[Int]] val 親部⾨門名  = x.get('親部⾨門名).asInstanceOf[Option[String]] a + (部⾨門ID -> 部⾨門(部⾨門ID, 部⾨門名, 親部⾨門ID, 親部⾨門名)) }) } def buildTree(sections: Map[Int, 部⾨門]): Tree[部⾨門] = { def build(sec: 部⾨門): Tree[部⾨門] = { val children = sections collect { case (k, v) if v.親部⾨門ID == sec.部⾨門ID.some => v } node(sec, children.toStream.sortBy(_.部⾨門ID).map(build)) } build(sections(1)) } def showTree(tree: Tree[部⾨門]) { println(tree.drawTree(showA[部⾨門])) }
  • 14.  val records = List(Map('部⾨門ID -> 1, '部⾨門名  -> "営業統括", Map('部⾨門ID -> 121, '親部⾨門ID -> None, '部⾨門名  -> "近畿⽀支店", '親部⾨門名  -> None), '親部⾨門ID -> Some(12), Map('部⾨門ID -> 11, '親部⾨門名  -> "⻄西⽇日本統括"), '部⾨門名  -> "東⽇日本統括", Map('部⾨門ID -> 122, '親部⾨門ID -> Some(1), '部⾨門名  -> "中国⽀支店", '親部⾨門名  -> "営業統括"), '親部⾨門ID -> Some(12), Map('部⾨門ID -> 12, '親部⾨門名  -> "⻄西⽇日本統括"), '部⾨門名  -> "⻄西⽇日本統括", Map('部⾨門ID -> 123, '親部⾨門ID -> Some(1), '部⾨門名  -> "四国⽀支店", '親部⾨門名  -> "営業統括"), '親部⾨門ID -> Some(12), Map('部⾨門ID -> 13, '親部⾨門名  -> "⻄西⽇日本統括"), '部⾨門名  -> "⾸首都圏統括", Map('部⾨門ID -> 124, '親部⾨門ID -> Some(1), '部⾨門名  -> "九州⽀支店", '親部⾨門名  -> "営業統括"), '親部⾨門ID -> Some(12), Map('部⾨門ID -> 111, '親部⾨門名  -> "⻄西⽇日本統括"), '部⾨門名  -> "北北海道⽀支店", Map('部⾨門ID -> 125, '親部⾨門ID -> Some(11), '部⾨門名  -> "沖縄⽀支店", '親部⾨門名  -> "東⽇日本統括"), '親部⾨門ID -> Some(12), Map('部⾨門ID -> 112, '親部⾨門名  -> "⻄西⽇日本統括"), '部⾨門名  -> "東北北⽀支店", Map('部⾨門ID -> 131, '親部⾨門ID -> Some(11), '部⾨門名  -> "東京⽀支店", '親部⾨門名  -> "東⽇日本統括"), '親部⾨門ID -> Some(13), Map('部⾨門ID -> 113, '親部⾨門名  -> "⾸首都圏統括"), '部⾨門名  -> "北北陸陸⽀支店", Map('部⾨門ID -> 132, '親部⾨門ID -> Some(11), '部⾨門名  -> "北北関東⽀支店", '親部⾨門名  -> "東⽇日本統括"), '親部⾨門ID -> Some(13), Map('部⾨門ID -> 114, '親部⾨門名  -> "⾸首都圏統括"), '部⾨門名  -> "中部⽀支店", Map('部⾨門ID -> 133, '親部⾨門ID -> Some(11), '部⾨門名  -> "南関東⽀支店", '親部⾨門名  -> "東⽇日本統括"), '親部⾨門ID -> Some(13), '親部⾨門名  -> "⾸首都圏統括"))
  • 15. 部⾨門(1,営業統括,None,Some(None)) | +- 部⾨門(11,東⽇日本統括,Some(1),Some(営業統括)) | | | +- 部⾨門(111,北北海道⽀支店,Some(11),Some(東⽇日本統括)) | | | +- 部⾨門(112,東北北⽀支店,Some(11),Some(東⽇日本統括)) | | | +- 部⾨門(113,北北陸陸⽀支店,Some(11),Some(東⽇日本統括)) | | | `- 部⾨門(114,中部⽀支店,Some(11),Some(東⽇日本統括)) | +- 部⾨門(12,⻄西⽇日本統括,Some(1),Some(営業統括)) | | | +- 部⾨門(121,近畿⽀支店,Some(12),Some(⻄西⽇日本統括)) | | | +- 部⾨門(122,中国⽀支店,Some(12),Some(⻄西⽇日本統括)) | | | +- 部⾨門(123,四国⽀支店,Some(12),Some(⻄西⽇日本統括)) | | | +- 部⾨門(124,九州⽀支店,Some(12),Some(⻄西⽇日本統括)) | | | `- 部⾨門(125,沖縄⽀支店,Some(12),Some(⻄西⽇日本統括)) | `- 部⾨門(13,⾸首都圏統括,Some(1),Some(営業統括)) | +- 部⾨門(131,東京⽀支店,Some(13),Some(⾸首都圏統括)) | +- 部⾨門(132,北北関東⽀支店,Some(13),Some(⾸首都圏統括)) | `- 部⾨門(133,南関東⽀支店,Some(13),Some(⾸首都圏統括))
  • 16. 並列列プログラミング 準備 時間を測る関数 テスト関数 def go[T](a: => T): (T, Long) = { val start = System.currentTimeMillis val f = (x: Int) => { val r = a Thread.sleep(x * 100) val end = System.currentTimeMillis x (r, end - start) } } scala> go(f(10)) scala> go { res176: (Int, Long) = (10,1000) | f(10) |} res253: (Int, Long) = (10,1001)
  • 17. PromiseのKleisli scala> val fp = f.promise fp: scalaz.Kleisli[scalaz.concurrent.Promise,Int,Int] = scalaz.Kleislis$$anon$1@9edaab8 Applicative scala> go((fp(1) |@| fp(2) |@| fp(3))(_ + _ + _).get) res215: (Int, Long) = (6,302) scala> go(f(1) + f(2) + f(3)) res212: (Int, Long) = (6,603) scala> go((1.some |@| 2.some |@| 3.some)(_ + _ + _).get) res237: (Int, Long) = (6,1)
  • 18. scala> go(List(1, 2, 3).map(fp).map(_.flatMap(fp)).sequence.get) res220: (List[Int], Long) = (List(1, 2, 3),602) scala> go(List(1, 2, 3).map(f).map(f)) res221: (List[Int], Long) = (List(1, 2, 3),1205) テスト関数 val fx = (x: Int) => { val t = math.abs(x - 4) Thread.sleep(t * 100) x } val fxp = fx.promise
  • 19. scala> go(List(1, 2, 3).map(fp).map(_.flatMap(fxp)).sequence.get) res222: (List[Int], Long) = (List(1, 2, 3),402) scala> go(List(1, 2, 3).map(f).map(fx)) res223: (List[Int], Long) = (List(1, 2, 3),1205) scala> go(List(1, 2, 3).map(fp >=> fxp).sequence.get) res230: (List[Int], Long) = (List(1, 2, 3),402) scala> go(List(1, 2, 3).map(f >>> fx)) res232: (List[Int], Long) = (List(1, 2, 3),1205)
  • 20. DSL import org.goldenport.dataflow._ val z = for (i <- table('T⽣生産実績)) yield { val x = i.sum('原価) + 10 val y = i.masterJoin('M部⾨門)((x, y) => x('部⾨門Id) == y('部⾨門Id) and x('製品Id) == y('製品Id)) val z = y.update('NEW_GENKA, x) val zz = z.where(x => x('部⾨門Id) == 1) val zzz = zz.record(SymbolFieldDef('A), SymbolFieldDef('B)) zzz } println(”SQL = " + z.toSql.toText) SQL = select sum(原価) + 10 as NEW_GENKA, A, B from T⽣生産実績 left outer join M部⾨門  on (T⽣生産実績.部⾨門Id = M部⾨門.部⾨門Id) and (T⽣生産実績.製品Id = M部⾨門. 製品Id) Where T⽣生産実績.部⾨門Id = 1
  • 22. 代数的データ型 •  Algebraic data type •  直積の直和の総和 •  再帰構造 ケースクラスで直積を実現 case class Person(name: String, age: Int) Case class Company(name: String, phone: String) Eitherで直積の直和を実現 Either[Person, Company] sealedトレイトで直積の直和の総和を実現 sealed trait Party case class Person(name: String, age: Int) extends Party case class Company(name: String, phone: String) extends Party
  • 23. 永続データ構造 •  Persistent data structure •  変更更される際に変更更前のバージョンを常に保持するデータ構造で ある。このようなデータ構造は、更更新の際に元のデータ構造を書 き換えるのではなく、新たなデータ構造を⽣生成すると考えられ、 イミュータブルなデータ構造の構築に利利⽤用可能である(Wikipedia)
  • 24. 代数的構造デザインパターン 結合律律 (associative law) •  半群 (semigroup) •  モノイド  (monoid) (a + b) + c = a + (b + c) •  群 (group) 可換律律 (commutative law) •  可換半群 •  可換モノイド a+b=b+a •  可換群(アーベル群) 分配律律 (distributive law) •  環  (ring) •  体 (field) a * (b + c) = a * b + a * c
  • 25. 圏論論デザインパターン 圏  (category) モナド   • Hask圏 (Scala圏?) (monad) • クライスリ圏   (kleisli category) Applicative 射 (arrow, functor morphism) 関⼿手   (functor)
  • 26. 並列列プログラミング •  マルチスレッド   •  共有状態 (shared mutability) •  共有状態をロック ← 伝統的⽅方法 •  STM (Software Transactional Memory) •  アクター •  状態をアクターローカル(スレッドローカル)にする (isolating mutability) •  不不変オブジェクトによるメッセージで通信 •  関数プログラミング⽅方式 •  代数的データ型、永続データ構造 •  ⇒ 参照透過性、不不変オブジェクト •  状態変更更ではなく、状態変更更命令令書を計算 •  イメージとしてはSQLの⽂文字列列を計算して作成する感じ •  モナドのメカニズムを使って並列列処理理(+状態変更更命令令書)を 隠蔽
  • 27. トピックス •  Monad •  http://modegramming.blogspot.jp/2012/08/30-13- monad.html •  Monoid •  http://modegramming.blogspot.jp/2012/08/30-12- monoid.html •  Fold •  http://modegramming.blogspot.jp/2012/07/30-10- map-filter-fold.html
  • 28. Monadicプログラミングの効⽤用 Java⾵風 def validate(name: String, age: Int): ValidationNEL[Throwable, (String, Int)] = {! val a = validateName(name) ! val b = validateAge(age) ! if (a.isSuccess && b.isSuccess) { ! val a1 = a.asInstanceOf[Success[NonEmptyList[Throwable], String]].a ! val b1 = b.asInstanceOf[Success[NonEmptyList[Throwable], Int]].a ! Success((a1, b1)) ! } else if (a.isSuccess) { ! b.asInstanceOf[Failure[NonEmptyList[Throwable], (String, Int)]] ! } else if (b.isSuccess) { ! a.asInstanceOf[Failure[NonEmptyList[Throwable], (String, Int)]] ! } else { ! val a1 = a.asInstanceOf[Failure[NonEmptyList[Throwable], String]].e ! val b1 = b.asInstanceOf[Failure[NonEmptyList[Throwable], Int]].e ! Failure(a1 |+| b1) ! } ! }!
  • 29. Scala (関数型プログラミング) def validate(name: String, age: Int): ValidationNEL[Throwable, (String, Int)] = { ! validateName(name) match { ! case Success(a) => validateAge(age) match { ! case Success(b) => Success((a, b)) ! case Failure(e) => Failure(e) ! } ! case Failure(e1) => validateAge(age) match { ! case Success(b) => Failure(e1) ! case Failure(e2) => Failure(e1 |+| e2) ! } ! } ! } ! Scalaz (Monadicプログラミング) def validate(name: String, age: Int): ValidationNEL[Throwable, (String, Int)] = { ! (validateName(name) ⊛ validateAge(age))((_, _)) ! }! URL: http://modegramming.blogspot.jp/2012/04/ scala-tips-validation-10-applicative.html
  • 35. パイプラインの構成部品 メソッド メソッド動作 動作イメージ コンテナ型 要素型 要素数 map コンテナ内の要素に M[A]→M[B] 変わらない 変わる 同じ 関数を適⽤用して新し いコンテナに詰め直 す。 filter コンテナ内の要素を M[A]→M[A] 変わらない 変わらない 同じ/減る 選別して新しコンテ ナに詰め直す。 fold コンテナをまるごと M[A]→N 変わる N/A N/A 別のオブジェクトに 変換する。 reduce コンテナの内容を⼀一 M[A]→A 変わる N/A N/A つにまとめる。 collect コンテナ内の要素に M[A]→M[B] 変わらない 変わる 同じ/減る 部分関数を適⽤用して 選択と変換を⾏行行う。 flatMap コンテナ内の要素ご M[A]→M[B] 変わらない 変わる 同じ/増える/減 とにコンテナを作成 る する関数を適⽤用し最 後に⼀一つのコンテナ にまとめる。
  • 36. まとめ •  Monadicプログラミングの狙い •  楽々プログラミング •  並列列プログラミング •  DSL •  データフロー •  関数型プログラミング •  ⼀一昔前の関数型プログラミングとは別物 •  A→B、A→M[B]の関数が基本 •  モナド、モノイド •  型クラス •  Monadicプログラミング •  パイプラインで考えると関数型にアプローチしやすい •  データフローで業務モデルと繋げたい
  • 37. END