SlideShare uma empresa Scribd logo
1 de 47
Baixar para ler offline
Functional Reactive Programming はじめの一歩
∼ 配線プログラミング ∼
@rf0444
おしながき
• スプレッドシートの話
• 配線プログラミング
スプレッドシートの話
スプレッドシート?
スプレッドシート?
スプレッドシートでは当たり前の、ある機能のお話をします。
一般的なプログラム
JavaScript
一般的なプログラム
JavaScript
4 になってほしいケース
• 値の変更があったら、関連する値も更新されて欲しい
• リアルタイムアプリケーション
• GUI
スプレッドシートの場合
スプレッドシートの場合
スプレッドシートの場合
スプレッドシートの場合
JavaScript での実装例
 - イベント駆動
function onChange() {
var a = Number($("#val1").val());
var b = Number($("#val2").val());
var c = a + b;
$("#val3").text(c);
}
$("#val1").change(onChange);
$("#val2").change(onChange);
JavaScript での実装
• イベント駆動プログラミング
• 変化が起きたときに実行する「処理」を書いていく
• 手続き的アプローチ
• Any other approach?
配線プログラミング
スプレッドシート と 配線 のイメージ
A1
B1
C1+
JavaScript での実装を考える
a
b
c+
Bacon.js
• JavaScript ライブラリ
• 配線プログラミング をサポート
• jQuery と連携できる
• 他の JavaScript フレームワークとも連携できる
• backbone.js との連携例あり
配線をつくる
a
b
c+
配線をつくる
a
b
c
配線をつくる
a
b
c
Bus
Bus Bus
function Model() {
var me = this;
me.a = new Bacon.Bus();
me.b = new Bacon.Bus();
me.c = new Bacon.Bus();
}
配線をつくる
a
b
c
function Model() {
var me = this;
me.a = new Bacon.Bus();
me.b = new Bacon.Bus();
me.c = new Bacon.Bus();
}
+
配線をつくる
a
b
c
function Model() {
var me = this;
me.a = new Bacon.Bus();
me.b = new Bacon.Bus();
me.c = new Bacon.Bus();
Bacon.combineWith(function(a, b) { return a + b; }, me.a, me.b)
}
配線をつくる
+
a
b
c
function Model() {
var me = this;
me.a = new Bacon.Bus();
me.b = new Bacon.Bus();
me.c = new Bacon.Bus();
Bacon.combineWith(function(a, b) { return a + b; }, me.a, me.b).change()
}
配線をつくる
+
a
b
c
function Model() {
var me = this;
me.a = new Bacon.Bus();
me.b = new Bacon.Bus();
me.c = new Bacon.Bus();
me.c.plug(
Bacon.combineWith(function(a, b) { return a + b; }, me.a, me.b).change()
);
}
入力側をつなげる
+
a
b
c
入力側をつなげる
+
a
b
c
入力側をつなげる
a
入力側をつなげる
busel
function InputView(el, bus) {
var me = this;
me.el = el;
}
a
入力側をつなげる
function InputView(el, bus) {
var me = this;
me.el = el;
me.el.asEventStream("change")
}
a
入力側をつなげる
(change event)
function InputView(el, bus) {
var me = this;
me.el = el;
me.el.asEventStream("change")
}
a
入力側をつなげる
“1”
function InputView(el, bus) {
var me = this;
me.el = el;
me.el.asEventStream("change")
.map(function() { return me.el.val(); })
}
a
入力側をつなげる
“1”初期値 ( “0” )
function InputView(el, bus) {
var me = this;
me.el = el;
me.el.asEventStream("change")
.map(function() { return me.el.val(); })
.merge(Bacon.once(me.el.val()))
}
a“1” “0”
入力側をつなげる
“1”初期値 ( “0” )
function InputView(el, bus) {
var me = this;
me.el = el;
me.el.asEventStream("change")
.map(function() { return me.el.val(); })
.merge(Bacon.once(me.el.val()))
.map(Number)
}
a“1” “0” 1 0
入力側をつなげる
a
function InputView(el, bus) {
var me = this;
me.el = el;
bus.plug(
me.el.asEventStream("change")
.map(function() { return me.el.val(); })
.merge(Bacon.once(me.el.val()))
.map(Number)
);
}
“1”初期値 ( “0” ) 1 0“1” “0”
出力側をつなげる
+
a
b
c
出力側をつなげる
+
a
b
c
出力側をつなげる
c
function OutputView(el, bus) {
var me = this;
me.el = el;
}
bus
el
出力側をつなげる
c
function OutputView(el, bus) {
var me = this;
me.el = el;
bus.assign(function(val) {
});
}
val
出力側をつなげる
c
function OutputView(el, bus) {
var me = this;
me.el = el;
bus.assign(function(val) {
me.el.text(val);
});
}
val
完成
var model = new Model();
new InputView($("#a"), model.a);
new InputView($("#b"), model.b);
new OutputView($("#c"), model.c);
a b c
model
+
部品プログラミング
「他の言語を学んで自由になろう」(山本和彦, http://mew.org/~kazu/material/2013-lang.pdf) より引用
部品プログラミング
「他の言語を学んで自由になろう」(山本和彦, http://mew.org/~kazu/material/2013-lang.pdf) より引用
部品プログラミング との組み合わせ
model
view1
(editable)
view2
設計例
View
Model
Storage
Ajax
request event for model
request to server response from server
response event for model
Functional Reactive Programming (FRP)
• 下の 2 つを関数でつないでいくことで、プログラムを書いていく方法
• 時間によって変化する値 (Behavior)
• 発生するイベントの列 (Event)
• GUI だけでなく、ログなどのリアルタイム解析でも利用されている
• 「配線プログラミング」は、実は FRP のこと
利用ライブラリ
• Bacon.js
• https://github.com/raimohanska/
• Behavior → Property、Event → EventStream

Mais conteúdo relacionado

Semelhante a Start FRP

速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-Kazunari Hara
 
今さら始めるCoffeeScript
今さら始めるCoffeeScript今さら始めるCoffeeScript
今さら始めるCoffeeScriptAshitaba YOSHIOKA
 
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】株式会社ランチェスター
 
Guide for Swift and Viewer app
Guide for Swift and Viewer appGuide for Swift and Viewer app
Guide for Swift and Viewer appShintaro Kaneko
 
15分でざっくり分かるScala入門
15分でざっくり分かるScala入門15分でざっくり分かるScala入門
15分でざっくり分かるScala入門SatoYu1ro
 
Functional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.jsFunctional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.jsShogo Sensui
 
探検!SwiftyJSON
探検!SwiftyJSON探検!SwiftyJSON
探検!SwiftyJSONYuka Ezura
 
TypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービューTypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービューAkira Inoue
 
JavaScriptクイックスタート
JavaScriptクイックスタートJavaScriptクイックスタート
JavaScriptクイックスタートShumpei Shiraishi
 
Async Enhancement
Async EnhancementAsync Enhancement
Async Enhancementkamiyam .
 
関数型プログラミング in javascript
関数型プログラミング in javascript関数型プログラミング in javascript
関数型プログラミング in javascriptRyuma Tsukano
 
なぜリアクティブは重要か #ScalaMatsuri
なぜリアクティブは重要か #ScalaMatsuriなぜリアクティブは重要か #ScalaMatsuri
なぜリアクティブは重要か #ScalaMatsuriYuta Okamoto
 
[DL輪読会]Control as Inferenceと発展
[DL輪読会]Control as Inferenceと発展[DL輪読会]Control as Inferenceと発展
[DL輪読会]Control as Inferenceと発展Deep Learning JP
 
CoffeeScriptってなんぞ?
CoffeeScriptってなんぞ?CoffeeScriptってなんぞ?
CoffeeScriptってなんぞ?Hayato Mizuno
 
サイ本読書会4章変数
サイ本読書会4章変数サイ本読書会4章変数
サイ本読書会4章変数ztyper
 

Semelhante a Start FRP (20)

速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-
 
今さら始めるCoffeeScript
今さら始めるCoffeeScript今さら始めるCoffeeScript
今さら始めるCoffeeScript
 
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
 
Guide for Swift and Viewer app
Guide for Swift and Viewer appGuide for Swift and Viewer app
Guide for Swift and Viewer app
 
15分でざっくり分かるScala入門
15分でざっくり分かるScala入門15分でざっくり分かるScala入門
15分でざっくり分かるScala入門
 
Functional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.jsFunctional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.js
 
探検!SwiftyJSON
探検!SwiftyJSON探検!SwiftyJSON
探検!SwiftyJSON
 
Ajax 応用
Ajax 応用Ajax 応用
Ajax 応用
 
TypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービューTypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービュー
 
JavaScriptクイックスタート
JavaScriptクイックスタートJavaScriptクイックスタート
JavaScriptクイックスタート
 
Coqでsprintf
CoqでsprintfCoqでsprintf
Coqでsprintf
 
Async Enhancement
Async EnhancementAsync Enhancement
Async Enhancement
 
関数型プログラミング in javascript
関数型プログラミング in javascript関数型プログラミング in javascript
関数型プログラミング in javascript
 
Coqでsprintf
CoqでsprintfCoqでsprintf
Coqでsprintf
 
なぜリアクティブは重要か #ScalaMatsuri
なぜリアクティブは重要か #ScalaMatsuriなぜリアクティブは重要か #ScalaMatsuri
なぜリアクティブは重要か #ScalaMatsuri
 
F#のすすめ
F#のすすめF#のすすめ
F#のすすめ
 
たのしい関数型
たのしい関数型たのしい関数型
たのしい関数型
 
[DL輪読会]Control as Inferenceと発展
[DL輪読会]Control as Inferenceと発展[DL輪読会]Control as Inferenceと発展
[DL輪読会]Control as Inferenceと発展
 
CoffeeScriptってなんぞ?
CoffeeScriptってなんぞ?CoffeeScriptってなんぞ?
CoffeeScriptってなんぞ?
 
サイ本読書会4章変数
サイ本読書会4章変数サイ本読書会4章変数
サイ本読書会4章変数
 

Mais de rf0444

PFDS 11.2.2
PFDS 11.2.2PFDS 11.2.2
PFDS 11.2.2rf0444
 
PFDS 10.1.2
PFDS 10.1.2PFDS 10.1.2
PFDS 10.1.2rf0444
 
PFDS 9.3.2
PFDS 9.3.2PFDS 9.3.2
PFDS 9.3.2rf0444
 
PFDS 9.3.1
PFDS 9.3.1PFDS 9.3.1
PFDS 9.3.1rf0444
 
PFDS 8.4.1
PFDS 8.4.1PFDS 8.4.1
PFDS 8.4.1rf0444
 
PFDS 7.4
PFDS 7.4PFDS 7.4
PFDS 7.4rf0444
 
Tapl 5
Tapl 5Tapl 5
Tapl 5rf0444
 
Haskellday rf
Haskellday rfHaskellday rf
Haskellday rfrf0444
 
PFDS 6.4.3
PFDS 6.4.3PFDS 6.4.3
PFDS 6.4.3rf0444
 

Mais de rf0444 (10)

SWF
SWFSWF
SWF
 
PFDS 11.2.2
PFDS 11.2.2PFDS 11.2.2
PFDS 11.2.2
 
PFDS 10.1.2
PFDS 10.1.2PFDS 10.1.2
PFDS 10.1.2
 
PFDS 9.3.2
PFDS 9.3.2PFDS 9.3.2
PFDS 9.3.2
 
PFDS 9.3.1
PFDS 9.3.1PFDS 9.3.1
PFDS 9.3.1
 
PFDS 8.4.1
PFDS 8.4.1PFDS 8.4.1
PFDS 8.4.1
 
PFDS 7.4
PFDS 7.4PFDS 7.4
PFDS 7.4
 
Tapl 5
Tapl 5Tapl 5
Tapl 5
 
Haskellday rf
Haskellday rfHaskellday rf
Haskellday rf
 
PFDS 6.4.3
PFDS 6.4.3PFDS 6.4.3
PFDS 6.4.3
 

Start FRP