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

きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回Tomoya Kawanishi
 
C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!TATSUYA HAYAMIZU
 
漏れのある抽象化の法則
漏れのある抽象化の法則漏れのある抽象化の法則
漏れのある抽象化の法則hayabusa333
 
マルチコアを用いた画像処理
マルチコアを用いた画像処理マルチコアを用いた画像処理
マルチコアを用いた画像処理Norishige Fukushima
 
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
画像処理ライブラリ OpenCV で 出来ること・出来ないこと画像処理ライブラリ OpenCV で 出来ること・出来ないこと
画像処理ライブラリ OpenCV で 出来ること・出来ないことNorishige Fukushima
 
ブラック企業から学ぶMVCモデル
ブラック企業から学ぶMVCモデルブラック企業から学ぶMVCモデル
ブラック企業から学ぶMVCモデルYuta Hiroto
 
最新リリース:Optuna V3の全て - 2022/12/10 Optuna Meetup #2
最新リリース:Optuna V3の全て - 2022/12/10 Optuna Meetup #2最新リリース:Optuna V3の全て - 2022/12/10 Optuna Meetup #2
最新リリース:Optuna V3の全て - 2022/12/10 Optuna Meetup #2Preferred Networks
 
リアクティブプログラミング
リアクティブプログラミングリアクティブプログラミング
リアクティブプログラミングYuuki Takano
 
暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学MITSUNARI Shigeo
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?Moriharu Ohzu
 
2値化CNN on FPGAでGPUとガチンコバトル(公開版)
2値化CNN on FPGAでGPUとガチンコバトル(公開版)2値化CNN on FPGAでGPUとガチンコバトル(公開版)
2値化CNN on FPGAでGPUとガチンコバトル(公開版)Hiroki Nakahara
 
[DL輪読会]Hindsight Experience Replay
[DL輪読会]Hindsight Experience Replay[DL輪読会]Hindsight Experience Replay
[DL輪読会]Hindsight Experience ReplayDeep Learning JP
 
青空文庫と式年遷宮アーキテクチャ: 青空文庫200周年に向けて
青空文庫と式年遷宮アーキテクチャ: 青空文庫200周年に向けて青空文庫と式年遷宮アーキテクチャ: 青空文庫200周年に向けて
青空文庫と式年遷宮アーキテクチャ: 青空文庫200周年に向けてmasayoshi takahashi
 
圏論のモナドとHaskellのモナド
圏論のモナドとHaskellのモナド圏論のモナドとHaskellのモナド
圏論のモナドとHaskellのモナドYoshihiro Mizoguchi
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!mosa siru
 
プログラムの処方箋~健康なコードと病んだコード
プログラムの処方箋~健康なコードと病んだコードプログラムの処方箋~健康なコードと病んだコード
プログラムの処方箋~健康なコードと病んだコードShigenori Sagawa
 
非技術者でもわかる(?)コンピュータビジョン紹介資料
非技術者でもわかる(?)コンピュータビジョン紹介資料非技術者でもわかる(?)コンピュータビジョン紹介資料
非技術者でもわかる(?)コンピュータビジョン紹介資料Takuya Minagawa
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」Takuto Wada
 
グルーミングしながら進めるプロダクト開発
グルーミングしながら進めるプロダクト開発グルーミングしながら進めるプロダクト開発
グルーミングしながら進めるプロダクト開発Takafumi ONAKA
 

What's hot (20)

きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回
 
ドロネー三角形分割
ドロネー三角形分割ドロネー三角形分割
ドロネー三角形分割
 
C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!
 
漏れのある抽象化の法則
漏れのある抽象化の法則漏れのある抽象化の法則
漏れのある抽象化の法則
 
マルチコアを用いた画像処理
マルチコアを用いた画像処理マルチコアを用いた画像処理
マルチコアを用いた画像処理
 
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
画像処理ライブラリ OpenCV で 出来ること・出来ないこと画像処理ライブラリ OpenCV で 出来ること・出来ないこと
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
 
ブラック企業から学ぶMVCモデル
ブラック企業から学ぶMVCモデルブラック企業から学ぶMVCモデル
ブラック企業から学ぶMVCモデル
 
最新リリース:Optuna V3の全て - 2022/12/10 Optuna Meetup #2
最新リリース:Optuna V3の全て - 2022/12/10 Optuna Meetup #2最新リリース:Optuna V3の全て - 2022/12/10 Optuna Meetup #2
最新リリース:Optuna V3の全て - 2022/12/10 Optuna Meetup #2
 
リアクティブプログラミング
リアクティブプログラミングリアクティブプログラミング
リアクティブプログラミング
 
暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
 
2値化CNN on FPGAでGPUとガチンコバトル(公開版)
2値化CNN on FPGAでGPUとガチンコバトル(公開版)2値化CNN on FPGAでGPUとガチンコバトル(公開版)
2値化CNN on FPGAでGPUとガチンコバトル(公開版)
 
[DL輪読会]Hindsight Experience Replay
[DL輪読会]Hindsight Experience Replay[DL輪読会]Hindsight Experience Replay
[DL輪読会]Hindsight Experience Replay
 
青空文庫と式年遷宮アーキテクチャ: 青空文庫200周年に向けて
青空文庫と式年遷宮アーキテクチャ: 青空文庫200周年に向けて青空文庫と式年遷宮アーキテクチャ: 青空文庫200周年に向けて
青空文庫と式年遷宮アーキテクチャ: 青空文庫200周年に向けて
 
圏論のモナドとHaskellのモナド
圏論のモナドとHaskellのモナド圏論のモナドとHaskellのモナド
圏論のモナドとHaskellのモナド
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
 
プログラムの処方箋~健康なコードと病んだコード
プログラムの処方箋~健康なコードと病んだコードプログラムの処方箋~健康なコードと病んだコード
プログラムの処方箋~健康なコードと病んだコード
 
非技術者でもわかる(?)コンピュータビジョン紹介資料
非技術者でもわかる(?)コンピュータビジョン紹介資料非技術者でもわかる(?)コンピュータビジョン紹介資料
非技術者でもわかる(?)コンピュータビジョン紹介資料
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
 
グルーミングしながら進めるプロダクト開発
グルーミングしながら進めるプロダクト開発グルーミングしながら進めるプロダクト開発
グルーミングしながら進めるプロダクト開発
 

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

論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 

Recently uploaded (10)

論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 

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