Mais conteúdo relacionado
Semelhante a Object-Functional Analysis and Design and Programming温泉 (20)
Mais de Tomoharu ASAMI (20)
Object-Functional Analysis and Design and Programming温泉
- 3. 論論点
• 業務アプリケーションにおける関数型⾔言語
• どこまでかけるのか
• モナドの使い所
• 業務アプリケーションにおけるオブジェクト指向⾔言語
• 本物のオブジェクト指向⾔言語から新たな気づきはないか
• 関数型⾔言語とオブジェクト指向⾔言語の選択
• 関数型⾔言語とモデリング技術の連携
• 形式⼿手法とモデリング?
- 6. アプリケーションの階層と役割
アプリケー • DSLの作法に従ってビジネスロ
ジックを記述
ション • OO、関数型のスキルは最低限
• フレームワークを簡単に使⽤用する
DSL ための専⽤用⾔言語
• OO、関数型の⾼高度度なスキル
フレーム • ドメインの共通処理理を記述
ワーク • OO、関数型の⾼高度度なスキル
- 7. ⽤用語
• セッション内でのローカルな⽤用法
• (普通の)オブジェクト指向⾔言語
• Java的なオブジェクト指向⾔言語。オブジェクト+クラス+抽象
データ型+静的型付け+⼿手続き+値。
• 本物のオブジェクト指向⾔言語
• オブジェクトとメッセージから構成される核に何かを加えたも
の。
• 関数型⾔言語
• 純粋関数型⾔言語(での利利⽤用も可能)
• イミュータブル、参照透過性
• モナドが⼀一級市⺠民
• 型クラス(相当)
• モデリング
• 業務アプリケーションを分析・設計するためのモデリング⼿手法
• UMLを使ったオブジェクト指向モデリング
- 11. 関数型⾔言語の⻑⾧長所と短所
⻑⾧長所
• ⾼高階関数を使った技が使える
• List処理理, 関数合成(コンビネータ)、モナドなど
• 定理理と証明
• 証明された(動作保証された)定理理(関数)を積み上げてプログラムを
記述できる (← 多少理理想論論も⼊入ってます)
短所
• 関数実⾏行行のオーバーヘッド
• 関数オブジェクト
• メモリを⼤大量量に消費する
• 関数オブジェクト
• データの⼤大量量複写
• スタックの使⽤用量量が読めない
• 再帰
• 回避する技のノウハウが必要
- 13. 代数的構造デザインパターン
結合律律 (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
- 14. 圏論論デザインパターン
圏 (category)
モナド • Hask圏 (Scala圏?)
(monad) • クライスリ圏
(kleisli category)
Applicative 射 (arrow,
functor morphism)
関⼿手
(functor)
- 15. 並列列プログラミング
• マルチスレッド
• 共有状態 (shared mutability)
• 共有状態をロック ← 伝統的⽅方法
• STM (Software Transactional Memory)
• アクター
• 状態をアクターローカル(スレッドローカル)にする (isolating
mutability)
• 不不変オブジェクトによるメッセージで通信
• 関数プログラミング⽅方式
• 代数的データ型、永続データ構造
• ⇒ 不不変オブジェクト
• 状態変更更ではなく、状態変更更命令令書を計算
• イメージとしてはSQLの⽂文字列列を計算して作成する感じ
• モナドのメカニズムを使って並列列処理理(+状態変更更命令令書)を
隠蔽
- 17. OFP新三種の神器
トレイト (trait)
• mix-in
• 型安全のAOP的な運⽤用
モナド (monad)
• 計算⽂文脈をカプセル化する新しい⾔言語概念念
• Monadicプログラミング
型クラス (type class)
• 型安全のダブルディスパッチ(?)
• Scalaでは、⽂文脈、主体、客体の組でオブジェクトを束縛
- 27. SparkとScalding
val file = spark.textFile("hdfs://...")
file.flatMap(line => line.split(" "))
.map(word => (word, 1))
Spark
.reduceByKey(_ + _)
class WordCountJob(args : Args) extends Job(args) {
TextLine( args("input") ).read.
flatMap('line -> 'word) { line : String => line.split("s+") }.
groupBy('word) { _.size }.
write( Tsv( args("output") ) )
}
Scalding
• https://github.com/twitter/scalding
• CascadingのScala DSL
• Collection APIでHadoop演算
- 28. まとめ
• 論論点
• 業務アプリケーションにおける関数型⾔言語
• どこまでかけるのか
• モナドの使い所
• 業務アプリケーションにおけるオブジェクト指向⾔言語
• 本物のオブジェクト指向⾔言語から新たな気づきはないか
• 関数型⾔言語とオブジェクト指向⾔言語の選択
• 関数型⾔言語とモデリング技術の連携
• 形式⼿手法とモデリング?