SlideShare a Scribd company logo
1 of 30
Download to read offline
フロントエンドに忍び寄る関数型の影
Elmで始める
Functional Reactive Programming	
 
前田康行 (@maeda_)
2013/2/23 大なごやjs
自己紹介	
 
!   前田康行 ( @maeda_ )
!   名古屋在住のフリーランス(http://www.illi-ichi.com)
!   好きな言語
! Scala
!   Smalltalk
! DyNagoya (http://dynagoya.info/)
= Dynamic language + Nagoya
この資料の目的	
 
!   想定対象者
!   普段はJavascriptなど、型のない言語を使っている
!   最近、関数型が流行っているらしいとは聞くが実態は
知らない
!   または、関数型言語の勉強をしてみたが、実践的なア
プリケーションの作り方は分からない
!   そういった人たちに、関数型プログラミングの
イメージを伝えることが目的です。
!   知らない用語が出てきても、スルーすれば大丈夫な
はず。
Elmについて
Elm とは	
 
!   Elm (http://elm-lang.org)
!   FRP(Functional Reactive Programming)をベースとした
Webアプリケーションフレームワーク
!   Elmのコード → Javascript + HTML + CSS を生成
!   HaskellをベースにWebアプリに適した文法を独自定義
!   Native Markdown support
!   Extensible Records
本家ページ(http://elm-lang.org)	
 
!   このページもElmで作られている
本家ページ(http://elm-lang.org)	
 
!   サンプルが豊富
!   ブラウザ上でコードを試せる
!   画面左のコードはサーバー側でコンパイルされて、
生成物が右側に表示される
Functional Reactive
Programming
Reactive Programmingとは	
 
!   典型例:Excel
!   A1やB1のセルの値を変えると、C1の値も勝手に変わる
!   C1の中で、A1やB1はReactiveな値
もし、Javascriptで書いたら・・・	
 
!   セルの状態を管理したり
!   更新時のcallbackを設定したり
const	
 sum	
 =	
 function(outCell){	
 
	
 	
 var	
 x,	
 y;	
 
	
 	
 function	
 update(){	
 
	
 	
 	
 	
 sheet(outCell).value(x	
 +	
 y);	
 
	
 	
 }	
 
	
 	
 return	
 {	
 
	
 	
 	
 	
 updateX:	
 function(cell)	
 {	
 x	
 =	
 cell.value();	
 update()	
 },	
 
	
 	
 	
 	
 updateY:	
 function(cell)	
 {	
 y	
 =	
 cell.value();	
 update()	
 }	
 
	
 	
 };	
 
}("C1");	
 
	
 
sheet("A1").on("update",	
 sum.updateX);	
 
sheet("B1").on("update",	
 sum.updateY);	
 
※これは架空のコードです。
もし、Elmで書いたら・・・	
 
!   このコードで、A1,B1の値が更新されたら、C1の
値が更新される	
 
main	
 =	
 lift	
 (Excel.update	
 "C1")	
 $	
 (+)	
 <〜	
 Excel.cell	
 "A1"	
 	
 
	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 〜	
 Excel.cell	
 "B1"	
 
※これは架空のコードです。
ブラウザ上でもReactiveがいい	
 
!   マルチタッチ対応のお絵描きアプリも5行で
(本家ページのBasic – Touch – Drawのサンプル)	
 
add	
 t	
 d	
 =	
 let	
 vs	
 =	
 Dict.findWithDefault	
 []	
 t.id	
 d	
 
	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 in	
 	
 Dict.insert	
 t.id	
 ((t.x,t.y):vs)	
 d	
 
	
 
scene	
 (w,h)	
 =	
 collage	
 w	
 h	
 .	
 map	
 (solid	
 red	
 .	
 line)	
 
	
 
main	
 =	
 let	
 ts	
 =	
 foldp	
 (	
 ts	
 d	
 ->	
 foldl	
 add	
 d	
 ts)	
 Dict.empty	
 Touch.touches	
 
	
 	
 	
 	
 	
 	
 	
 in	
 	
 lift2	
 scene	
 Window.dimensions	
 (lift	
 Dict.values	
 ts)	
 
※これは架空のコードではありません。	
 
3本指で同時に描いた線 →
Callback地獄からの脱却	
 
!   シングルスレッドなJSでは、コールバックが多用され
る
!   一般的に、Callbackはコードの流れを断絶し、可読性を
下げることが多い
!   ElmならReactiveで、かつ、Functionalなコードが書ける
Functionalな
プログラミング
Functionalなプログラミング	
 とは	
 
1.  (ただの)Functional Programming
関数を組み合わせてプログラムを構成
2.  Purely Functional Programming
純粋な関数(副作用がない関数)でプログラムを構成
(= 外界に影響を与えず、同じ引数には同じ戻り値を返す)
!   副作用の例
!   マウスの位置やクリック状況を取得
!   画面に何かを描画する
!   Ajax通信
!   時間を取得
!   変数の値(状態)を書き換える
Elmは純粋な関数しか作れない!
純粋な関数	
 
副作用のないプログラミング	
 
「外部から副作用をもらった時、どう副作用を与えるか」
を記述する。	
 
Key Down
Reactiveな値
(ライブラリとして提供)	
 
Timer	
 
画面表示
実行時に変化があると、
値を純粋な関数に流し込む
純粋な関数	
 
副作用のないプログラミング	
 
「外部から副作用をもらった時、どう副作用を与えるか」
を記述する。	
 
Key Down
Timer	
 
画面表示
f1	
 
f2	
 
f3	
 
f4	
 
純粋な関数を合成して
ひとつの関数を作る	
 
外部の値をもらう時は
普通の適用とは異なる
「意味イベント」を作る	
 
!   意味イベントという言葉はITプランニング小笠原さんが発案
http://www.itpl.co.jp/tech/func/event-driven.pdf
!   生のイベントを変換/合成して、より意味のあるイベントに
する
純粋な関数	
 
Key Down
Timer	
 
画面表示
ダイアログ
を閉じる	
 
ESCキーを
押下	
 
Mouse Click
×ボタンを
クリック
一定時間
経過
Elmで
Programming
Elmは強い型付け言語	
 
!   値には必ず型がつく。
! Int, String, Float, ...
!   [a](リスト), Set a(集合), Dict a(ハッシュテーブル)
!   関数(A → B → C はA型とB型を受け取って、C型を返す関数)
!   代数データ型、レコード
!   関数に渡すときに、型が合わないとコンパイルエラー
f1 :: Float →Int	
  f2 :: Int→String	
 3.5 :: Float	
  “□□□” :: String	
 
※「a :: A」という表記はaがA型であることを
 「A→B」という表記はA型からB型に変換する関数を示す
型チェック	
 型チェック
Reactiveな世界	
 純粋な世界	
 
Signal a型	
 (aは何かの型)	
 
!   純粋な値と外部からやってくる値を型で区別
!   外からやってくるReactiveな値は「Signal a型」となる
(aには純粋な世界の型が入る)
!   「Signal Int型」は何らかの数値(Int)の値となるReactiveな値を表す
Int	
 
String	
 
Element	
 
Time	
 
Signal Int	
 
Signal String	
 
Signal Element	
 
Signal Time
Reactiveな値を変換する	
 
!   Reactiveな値を変換する場合、関数をReactiveな世
界に持ち上げて(liftして)、適用する
Reactiveな世界	
 純粋な世界	
 
format :: Int → String	
 
Mouse.x :: Signal Int	
 30 :: Int	
 
"X座標は30です" :: String	
  "X座標は□です" :: Signal String	
 
lift format
:: Signal Int → Signal String
Signal Element型に持っていく	
 
!   画面に表示されるものはElement型で表される
!   Signal a型の値を変換して、
最終的にSignal Element型を作るようなmain関数を作る
--	
 マウスカーソルに合わせて画像をリサイズする	
 
drawImage	
 (w,	
 h)	
 =	
 image	
 w	
 h	
 "/images/hoge.jpg"	
 
main	
 =	
 lift	
 drawImage	
 Mouse.position	
 
drawImage :: (Int, Int) → Element	
 
lift drawImage :: Signal (Int, Int) → Signal Element	
 
Mouse.position :: Signal (Int, Int)	
 
main :: Signal Element
最後に
関数型言語の教材として
Elmはよいのではないか?	
 
!   お手軽
!   ブラウザ上で、目に見える形で動作するアプリケーショ
ンがすぐに試せる
!   簡単
!   出来る事が限定されているのでHaskellよりも簡単
!   簡単側に倒れていることが多い	
 
!   IO Monadがない。Functorが分かれば大丈夫
!   ただしSignalのダイナミックな配線の変更はできない
!   教育的	
 
!   サンプルが豊富
!   サンプルのコメントにExerciseがあったり
!   ピンポンゲームの作成チュートリアルもある
!   標準ライブラリが弱いので、自分で定義しなくてはなら
ない
一方で、Elmの注意点	
 
!   まだ発展途上。いろいろ厳しい
!   コンパイルエラーが分かりにくい
!   修行だと思ってください
!   REPLがない
!   型を調べたり、ちょっとした確認が面倒
!   ブラウザ上でHaskellを動かしたいわけではない。
!   Haskellをベースにブラウザ+FRPに適した構文を追求
!   Haskellは遅延評価だが、Elmは正格評価
遅延評価でFRPを実装するのは難しいらしい
(メモリリークなどの観点で)
!   where句は実装予定
!   特殊なifの構文
Elmを始めるには	
 
!   まずHaskellの勉強から
!   「すごいHaskell楽しく学ぼう(通称:すごいH本)」
11章あたりまで読めれば十分。途中まででも多分大丈夫
!   Haskellの基本は分かったがアプリを作るイメージが
湧かない
→ そこでElmをやってみる
!   サンプルを適当にいじってみたり
!   ピンポンのチュートリアルやったり
(おまけ)
説明しきれなかったこと	
 
!   状態を扱いたい → foldpを使う
foldp :: (a → b → b) → b → Signal a → Signal b	
! Javascriptとの連携(FFI)
!   JS側で登録したイベントをSignal aとしてElmで扱う
!   ElmのSignal aをイベントとしてJS側に渡す
!   Applicativeスタイルでの記述
(<〜) :: (a → b) → Signal a → Signal b
(〜) :: Signal (a → b) → Signal a → Signal b
(おまけ)
elm-serverをローカルで立てる	
 
!   Mac OS X で home brew を使用した場合
>	
 brew	
 install	
 ghc	
 
>	
 brew	
 install	
 cabal-install	
 
>	
 cd	
 (git	
 repos)	
 
>	
 git	
 clone	
 https://github.com/evancz/Elm.git	
 
>	
 cd	
 Elm/elm	
 
>	
 cabal	
 install	
 Elm.cabal	
 
>	
 cd	
 (git	
 repos)	
 
>	
 git	
 clone	
 https://github.com/evancz/elm-lang.org.git	
 
>	
 cd	
 elm-lang.org/	
 
>	
 ./compile.sh	
 
>	
 ./server/Server	
 
ブラウザでhttp://localhost:8000/ を開く
参考文献	
 
!   Elm: Concurrent FRP for Functional GUIs
http://www.testblogpleaseignore.com/wp-content/uploads/2012/04/thesis.pdf
Elmの論文
!   イベントドリブンプログラミングの関数型的書き方
http://www.itpl.co.jp/tech/func/event-driven.pdf
FRPという言葉のないFRPの説明(OCaml)
! maoeのブログ「FRPの話」
http://maoe.hatenadiary.jp/entry/2012/12/24/011414
包括的なFRPのまとめ(ほぼHaskell)
ちなみにElmはArrowized FRP

More Related Content

What's hot

Git flowの活用事例
Git flowの活用事例Git flowの活用事例
Git flowの活用事例Hirohito Kato
 
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメYoji Kanno
 
良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方Shigenori Sagawa
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?Yoshitaka Kawashima
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織Takafumi ONAKA
 
RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話Takuto Wada
 
レイヤードアーキテクチャを意識したPHPアプリケーションの構築
レイヤードアーキテクチャを意識したPHPアプリケーションの構築レイヤードアーキテクチャを意識したPHPアプリケーションの構築
レイヤードアーキテクチャを意識したPHPアプリケーションの構築Masashi Shinbara
 
Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略Takayuki Shimizukawa
 
「速」を落とさないコードレビュー
「速」を落とさないコードレビュー「速」を落とさないコードレビュー
「速」を落とさないコードレビューTakafumi ONAKA
 
MySQL Casual Talks Vol.4 「MySQL-5.6で始める全文検索 〜InnoDB FTS編〜」
MySQL Casual Talks Vol.4 「MySQL-5.6で始める全文検索 〜InnoDB FTS編〜」MySQL Casual Talks Vol.4 「MySQL-5.6で始める全文検索 〜InnoDB FTS編〜」
MySQL Casual Talks Vol.4 「MySQL-5.6で始める全文検索 〜InnoDB FTS編〜」Kentaro Yoshida
 
食べログのフロントエンドエンジニアってめっちゃ大変やねん・・・
食べログのフロントエンドエンジニアってめっちゃ大変やねん・・・食べログのフロントエンドエンジニアってめっちゃ大変やねん・・・
食べログのフロントエンドエンジニアってめっちゃ大変やねん・・・Yoshie Kaneno
 
WebSocketのキホン
WebSocketのキホンWebSocketのキホン
WebSocketのキホンYou_Kinjoh
 
いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0Masakazu Matsushita
 
どこに何を書くのか?
どこに何を書くのか?どこに何を書くのか?
どこに何を書くのか?pospome
 
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解するそうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解するshigeki_ohtsu
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているKoichi Tanaka
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪Takuto Wada
 
モデリングもしないでアジャイルとは何事だ
モデリングもしないでアジャイルとは何事だモデリングもしないでアジャイルとは何事だ
モデリングもしないでアジャイルとは何事だIwao Harada
 
ふつうのcore.async
ふつうのcore.asyncふつうのcore.async
ふつうのcore.asyncTsutomu Yano
 
MVC の Model を考える
MVC の Model を考えるMVC の Model を考える
MVC の Model を考えるtomo_masakura
 

What's hot (20)

Git flowの活用事例
Git flowの活用事例Git flowの活用事例
Git flowの活用事例
 
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
 
良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
 
RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話
 
レイヤードアーキテクチャを意識したPHPアプリケーションの構築
レイヤードアーキテクチャを意識したPHPアプリケーションの構築レイヤードアーキテクチャを意識したPHPアプリケーションの構築
レイヤードアーキテクチャを意識したPHPアプリケーションの構築
 
Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略Webアプリを並行開発する際のマイグレーション戦略
Webアプリを並行開発する際のマイグレーション戦略
 
「速」を落とさないコードレビュー
「速」を落とさないコードレビュー「速」を落とさないコードレビュー
「速」を落とさないコードレビュー
 
MySQL Casual Talks Vol.4 「MySQL-5.6で始める全文検索 〜InnoDB FTS編〜」
MySQL Casual Talks Vol.4 「MySQL-5.6で始める全文検索 〜InnoDB FTS編〜」MySQL Casual Talks Vol.4 「MySQL-5.6で始める全文検索 〜InnoDB FTS編〜」
MySQL Casual Talks Vol.4 「MySQL-5.6で始める全文検索 〜InnoDB FTS編〜」
 
食べログのフロントエンドエンジニアってめっちゃ大変やねん・・・
食べログのフロントエンドエンジニアってめっちゃ大変やねん・・・食べログのフロントエンドエンジニアってめっちゃ大変やねん・・・
食べログのフロントエンドエンジニアってめっちゃ大変やねん・・・
 
WebSocketのキホン
WebSocketのキホンWebSocketのキホン
WebSocketのキホン
 
いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0
 
どこに何を書くのか?
どこに何を書くのか?どこに何を書くのか?
どこに何を書くのか?
 
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解するそうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
モデリングもしないでアジャイルとは何事だ
モデリングもしないでアジャイルとは何事だモデリングもしないでアジャイルとは何事だ
モデリングもしないでアジャイルとは何事だ
 
ふつうのcore.async
ふつうのcore.asyncふつうのcore.async
ふつうのcore.async
 
MVC の Model を考える
MVC の Model を考えるMVC の Model を考える
MVC の Model を考える
 

Viewers also liked

50分でわかるブループリントについて
50分でわかるブループリントについて50分でわかるブループリントについて
50分でわかるブループリントについてMasahiko Nakamura
 
IdrisでWebアプリを書く
IdrisでWebアプリを書くIdrisでWebアプリを書く
IdrisでWebアプリを書くHideyuki Tanaka
 
Haskell で LINE Bot を作ってみた
Haskell で LINE Bot を作ってみたHaskell で LINE Bot を作ってみた
Haskell で LINE Bot を作ってみたNobutada Matsubara
 
「7つの言語、7つの世界」を読む
「7つの言語、7つの世界」を読む「7つの言語、7つの世界」を読む
「7つの言語、7つの世界」を読むNobutada Matsubara
 
ADVENTAR の Bot を作る with Haskell
ADVENTAR の Bot を作る with HaskellADVENTAR の Bot を作る with Haskell
ADVENTAR の Bot を作る with HaskellNobutada Matsubara
 

Viewers also liked (9)

50分でわかるブループリントについて
50分でわかるブループリントについて50分でわかるブループリントについて
50分でわかるブループリントについて
 
Haskell Lecture 1
Haskell Lecture 1Haskell Lecture 1
Haskell Lecture 1
 
IdrisでWebアプリを書く
IdrisでWebアプリを書くIdrisでWebアプリを書く
IdrisでWebアプリを書く
 
Elm overview
Elm overviewElm overview
Elm overview
 
Haskell Backpack 事始め
Haskell Backpack 事始めHaskell Backpack 事始め
Haskell Backpack 事始め
 
Haskell で LINE Bot を作ってみた
Haskell で LINE Bot を作ってみたHaskell で LINE Bot を作ってみた
Haskell で LINE Bot を作ってみた
 
「7つの言語、7つの世界」を読む
「7つの言語、7つの世界」を読む「7つの言語、7つの世界」を読む
「7つの言語、7つの世界」を読む
 
型! 型!
型! 型!型! 型!
型! 型!
 
ADVENTAR の Bot を作る with Haskell
ADVENTAR の Bot を作る with HaskellADVENTAR の Bot を作る with Haskell
ADVENTAR の Bot を作る with Haskell
 

Similar to Elmで始めるFunctional Reactive Programming

Jubatusのリアルタイム分散レコメンデーション@TokyoWebmining#17
Jubatusのリアルタイム分散レコメンデーション@TokyoWebmining#17Jubatusのリアルタイム分散レコメンデーション@TokyoWebmining#17
Jubatusのリアルタイム分散レコメンデーション@TokyoWebmining#17Yuya Unno
 
これからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツールこれからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツールNobuhisa Koizumi
 
最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~
最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~
最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~Fujio Kojima
 
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)啓 小笠原
 
Jubatusのリアルタイム分散レコメンデーション@TokyoNLP#9
Jubatusのリアルタイム分散レコメンデーション@TokyoNLP#9Jubatusのリアルタイム分散レコメンデーション@TokyoNLP#9
Jubatusのリアルタイム分散レコメンデーション@TokyoNLP#9Yuya Unno
 
普通のプログラミング言語R
普通のプログラミング言語R普通のプログラミング言語R
普通のプログラミング言語RShuyo Nakatani
 
Deep Learningの基礎と応用
Deep Learningの基礎と応用Deep Learningの基礎と応用
Deep Learningの基礎と応用Seiya Tokui
 
インターフェイス実装の活用例 AS編
インターフェイス実装の活用例 AS編インターフェイス実装の活用例 AS編
インターフェイス実装の活用例 AS編Yoshitaka Kimisaki
 
Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Ra Zon
 
第2回 Android勉強会
第2回 Android勉強会第2回 Android勉強会
第2回 Android勉強会fujikunn
 
BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 1
BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 1BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 1
BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 1Atsushi Tadokoro
 
デジタルアートセミナー#2 openFrameworksで学ぶ、 クリエイティブ・コーディング Session 1: openFrameworks入門
デジタルアートセミナー#2 openFrameworksで学ぶ、 クリエイティブ・コーディング Session 1: openFrameworks入門デジタルアートセミナー#2 openFrameworksで学ぶ、 クリエイティブ・コーディング Session 1: openFrameworks入門
デジタルアートセミナー#2 openFrameworksで学ぶ、 クリエイティブ・コーディング Session 1: openFrameworks入門Atsushi Tadokoro
 
Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Ra Zon
 
第一回ゆるふわーる
第一回ゆるふわーる第一回ゆるふわーる
第一回ゆるふわーるSachiko Hirata
 
磯野ー!関数型言語やろうぜー!
磯野ー!関数型言語やろうぜー!磯野ー!関数型言語やろうぜー!
磯野ー!関数型言語やろうぜー!Ra Zon
 
Erlangやってみた
ErlangやってみたErlangやってみた
Erlangやってみたina job
 
Titanium Mobile ~本当にあったこわい話~
Titanium Mobile ~本当にあったこわい話~Titanium Mobile ~本当にあったこわい話~
Titanium Mobile ~本当にあったこわい話~Atsushi Harada
 

Similar to Elmで始めるFunctional Reactive Programming (20)

Jubatusのリアルタイム分散レコメンデーション@TokyoWebmining#17
Jubatusのリアルタイム分散レコメンデーション@TokyoWebmining#17Jubatusのリアルタイム分散レコメンデーション@TokyoWebmining#17
Jubatusのリアルタイム分散レコメンデーション@TokyoWebmining#17
 
これからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツールこれからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツール
 
最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~
最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~
最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~
 
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)
 
Realm meet up #17
Realm meet up #17Realm meet up #17
Realm meet up #17
 
Jubatusのリアルタイム分散レコメンデーション@TokyoNLP#9
Jubatusのリアルタイム分散レコメンデーション@TokyoNLP#9Jubatusのリアルタイム分散レコメンデーション@TokyoNLP#9
Jubatusのリアルタイム分散レコメンデーション@TokyoNLP#9
 
普通のプログラミング言語R
普通のプログラミング言語R普通のプログラミング言語R
普通のプログラミング言語R
 
Deep Learningの基礎と応用
Deep Learningの基礎と応用Deep Learningの基礎と応用
Deep Learningの基礎と応用
 
インターフェイス実装の活用例 AS編
インターフェイス実装の活用例 AS編インターフェイス実装の活用例 AS編
インターフェイス実装の活用例 AS編
 
はじめての「R」
はじめての「R」はじめての「R」
はじめての「R」
 
Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]
 
第2回 Android勉強会
第2回 Android勉強会第2回 Android勉強会
第2回 Android勉強会
 
BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 1
BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 1BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 1
BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 1
 
ATN No.2 Scala事始め
ATN No.2 Scala事始めATN No.2 Scala事始め
ATN No.2 Scala事始め
 
デジタルアートセミナー#2 openFrameworksで学ぶ、 クリエイティブ・コーディング Session 1: openFrameworks入門
デジタルアートセミナー#2 openFrameworksで学ぶ、 クリエイティブ・コーディング Session 1: openFrameworks入門デジタルアートセミナー#2 openFrameworksで学ぶ、 クリエイティブ・コーディング Session 1: openFrameworks入門
デジタルアートセミナー#2 openFrameworksで学ぶ、 クリエイティブ・コーディング Session 1: openFrameworks入門
 
Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]
 
第一回ゆるふわーる
第一回ゆるふわーる第一回ゆるふわーる
第一回ゆるふわーる
 
磯野ー!関数型言語やろうぜー!
磯野ー!関数型言語やろうぜー!磯野ー!関数型言語やろうぜー!
磯野ー!関数型言語やろうぜー!
 
Erlangやってみた
ErlangやってみたErlangやってみた
Erlangやってみた
 
Titanium Mobile ~本当にあったこわい話~
Titanium Mobile ~本当にあったこわい話~Titanium Mobile ~本当にあったこわい話~
Titanium Mobile ~本当にあったこわい話~
 

Recently uploaded

CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
業務で生成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
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~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...博三 太田
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
自分史上一番早い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)

CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
業務で生成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
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~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...
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
自分史上一番早い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
 

Elmで始めるFunctional Reactive Programming

  • 2. 自己紹介 !   前田康行 ( @maeda_ ) !   名古屋在住のフリーランス(http://www.illi-ichi.com) !   好きな言語 ! Scala !   Smalltalk ! DyNagoya (http://dynagoya.info/) = Dynamic language + Nagoya
  • 3. この資料の目的 !   想定対象者 !   普段はJavascriptなど、型のない言語を使っている !   最近、関数型が流行っているらしいとは聞くが実態は 知らない !   または、関数型言語の勉強をしてみたが、実践的なア プリケーションの作り方は分からない !   そういった人たちに、関数型プログラミングの イメージを伝えることが目的です。 !   知らない用語が出てきても、スルーすれば大丈夫な はず。
  • 5. Elm とは !   Elm (http://elm-lang.org) !   FRP(Functional Reactive Programming)をベースとした Webアプリケーションフレームワーク !   Elmのコード → Javascript + HTML + CSS を生成 !   HaskellをベースにWebアプリに適した文法を独自定義 !   Native Markdown support !   Extensible Records
  • 6. 本家ページ(http://elm-lang.org) !   このページもElmで作られている
  • 7. 本家ページ(http://elm-lang.org) !   サンプルが豊富 !   ブラウザ上でコードを試せる !   画面左のコードはサーバー側でコンパイルされて、 生成物が右側に表示される
  • 9. Reactive Programmingとは !   典型例:Excel !   A1やB1のセルの値を変えると、C1の値も勝手に変わる !   C1の中で、A1やB1はReactiveな値
  • 10. もし、Javascriptで書いたら・・・ !   セルの状態を管理したり !   更新時のcallbackを設定したり const sum = function(outCell){ var x, y; function update(){ sheet(outCell).value(x + y); } return { updateX: function(cell) { x = cell.value(); update() }, updateY: function(cell) { y = cell.value(); update() } }; }("C1"); sheet("A1").on("update", sum.updateX); sheet("B1").on("update", sum.updateY); ※これは架空のコードです。
  • 11. もし、Elmで書いたら・・・ !   このコードで、A1,B1の値が更新されたら、C1の 値が更新される main = lift (Excel.update "C1") $ (+) <〜 Excel.cell "A1" 〜 Excel.cell "B1" ※これは架空のコードです。
  • 12. ブラウザ上でもReactiveがいい !   マルチタッチ対応のお絵描きアプリも5行で (本家ページのBasic – Touch – Drawのサンプル) add t d = let vs = Dict.findWithDefault [] t.id d in Dict.insert t.id ((t.x,t.y):vs) d scene (w,h) = collage w h . map (solid red . line) main = let ts = foldp ( ts d -> foldl add d ts) Dict.empty Touch.touches in lift2 scene Window.dimensions (lift Dict.values ts) ※これは架空のコードではありません。 3本指で同時に描いた線 →
  • 13. Callback地獄からの脱却 !   シングルスレッドなJSでは、コールバックが多用され る !   一般的に、Callbackはコードの流れを断絶し、可読性を 下げることが多い !   ElmならReactiveで、かつ、Functionalなコードが書ける
  • 15. Functionalなプログラミング とは 1.  (ただの)Functional Programming 関数を組み合わせてプログラムを構成 2.  Purely Functional Programming 純粋な関数(副作用がない関数)でプログラムを構成 (= 外界に影響を与えず、同じ引数には同じ戻り値を返す) !   副作用の例 !   マウスの位置やクリック状況を取得 !   画面に何かを描画する !   Ajax通信 !   時間を取得 !   変数の値(状態)を書き換える Elmは純粋な関数しか作れない!
  • 16. 純粋な関数 副作用のないプログラミング 「外部から副作用をもらった時、どう副作用を与えるか」 を記述する。 Key Down Reactiveな値 (ライブラリとして提供) Timer 画面表示 実行時に変化があると、 値を純粋な関数に流し込む
  • 17. 純粋な関数 副作用のないプログラミング 「外部から副作用をもらった時、どう副作用を与えるか」 を記述する。 Key Down Timer 画面表示 f1 f2 f3 f4 純粋な関数を合成して ひとつの関数を作る 外部の値をもらう時は 普通の適用とは異なる
  • 18. 「意味イベント」を作る !   意味イベントという言葉はITプランニング小笠原さんが発案 http://www.itpl.co.jp/tech/func/event-driven.pdf !   生のイベントを変換/合成して、より意味のあるイベントに する 純粋な関数 Key Down Timer 画面表示 ダイアログ を閉じる ESCキーを 押下 Mouse Click ×ボタンを クリック 一定時間 経過
  • 20. Elmは強い型付け言語 !   値には必ず型がつく。 ! Int, String, Float, ... !   [a](リスト), Set a(集合), Dict a(ハッシュテーブル) !   関数(A → B → C はA型とB型を受け取って、C型を返す関数) !   代数データ型、レコード !   関数に渡すときに、型が合わないとコンパイルエラー f1 :: Float →Int f2 :: Int→String 3.5 :: Float “□□□” :: String ※「a :: A」という表記はaがA型であることを  「A→B」という表記はA型からB型に変換する関数を示す 型チェック 型チェック
  • 21. Reactiveな世界 純粋な世界 Signal a型 (aは何かの型) !   純粋な値と外部からやってくる値を型で区別 !   外からやってくるReactiveな値は「Signal a型」となる (aには純粋な世界の型が入る) !   「Signal Int型」は何らかの数値(Int)の値となるReactiveな値を表す Int String Element Time Signal Int Signal String Signal Element Signal Time
  • 22. Reactiveな値を変換する !   Reactiveな値を変換する場合、関数をReactiveな世 界に持ち上げて(liftして)、適用する Reactiveな世界 純粋な世界 format :: Int → String Mouse.x :: Signal Int 30 :: Int "X座標は30です" :: String "X座標は□です" :: Signal String lift format :: Signal Int → Signal String
  • 23. Signal Element型に持っていく !   画面に表示されるものはElement型で表される !   Signal a型の値を変換して、 最終的にSignal Element型を作るようなmain関数を作る -- マウスカーソルに合わせて画像をリサイズする drawImage (w, h) = image w h "/images/hoge.jpg" main = lift drawImage Mouse.position drawImage :: (Int, Int) → Element lift drawImage :: Signal (Int, Int) → Signal Element Mouse.position :: Signal (Int, Int) main :: Signal Element
  • 25. 関数型言語の教材として Elmはよいのではないか? !   お手軽 !   ブラウザ上で、目に見える形で動作するアプリケーショ ンがすぐに試せる !   簡単 !   出来る事が限定されているのでHaskellよりも簡単 !   簡単側に倒れていることが多い !   IO Monadがない。Functorが分かれば大丈夫 !   ただしSignalのダイナミックな配線の変更はできない !   教育的 !   サンプルが豊富 !   サンプルのコメントにExerciseがあったり !   ピンポンゲームの作成チュートリアルもある !   標準ライブラリが弱いので、自分で定義しなくてはなら ない
  • 26. 一方で、Elmの注意点 !   まだ発展途上。いろいろ厳しい !   コンパイルエラーが分かりにくい !   修行だと思ってください !   REPLがない !   型を調べたり、ちょっとした確認が面倒 !   ブラウザ上でHaskellを動かしたいわけではない。 !   Haskellをベースにブラウザ+FRPに適した構文を追求 !   Haskellは遅延評価だが、Elmは正格評価 遅延評価でFRPを実装するのは難しいらしい (メモリリークなどの観点で) !   where句は実装予定 !   特殊なifの構文
  • 27. Elmを始めるには !   まずHaskellの勉強から !   「すごいHaskell楽しく学ぼう(通称:すごいH本)」 11章あたりまで読めれば十分。途中まででも多分大丈夫 !   Haskellの基本は分かったがアプリを作るイメージが 湧かない → そこでElmをやってみる !   サンプルを適当にいじってみたり !   ピンポンのチュートリアルやったり
  • 28. (おまけ) 説明しきれなかったこと !   状態を扱いたい → foldpを使う foldp :: (a → b → b) → b → Signal a → Signal b ! Javascriptとの連携(FFI) !   JS側で登録したイベントをSignal aとしてElmで扱う !   ElmのSignal aをイベントとしてJS側に渡す !   Applicativeスタイルでの記述 (<〜) :: (a → b) → Signal a → Signal b (〜) :: Signal (a → b) → Signal a → Signal b
  • 29. (おまけ) elm-serverをローカルで立てる !   Mac OS X で home brew を使用した場合 > brew install ghc > brew install cabal-install > cd (git repos) > git clone https://github.com/evancz/Elm.git > cd Elm/elm > cabal install Elm.cabal > cd (git repos) > git clone https://github.com/evancz/elm-lang.org.git > cd elm-lang.org/ > ./compile.sh > ./server/Server ブラウザでhttp://localhost:8000/ を開く
  • 30. 参考文献 !   Elm: Concurrent FRP for Functional GUIs http://www.testblogpleaseignore.com/wp-content/uploads/2012/04/thesis.pdf Elmの論文 !   イベントドリブンプログラミングの関数型的書き方 http://www.itpl.co.jp/tech/func/event-driven.pdf FRPという言葉のないFRPの説明(OCaml) ! maoeのブログ「FRPの話」 http://maoe.hatenadiary.jp/entry/2012/12/24/011414 包括的なFRPのまとめ(ほぼHaskell) ちなみにElmはArrowized FRP