Your SlideShare is downloading. ×
frp tutorial
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

frp tutorial

2,447

Published on

0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,447
On Slideshare
0
From Embeds
0
Number of Embeds
6
Actions
Shares
0
Downloads
4
Comments
0
Likes
2
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Functional ReactiveProgramming (FRP) with reactive-banana-0.6.0.0 Heinrich Apfelmus Translated by Akira Takahashi (faithandbrave@gmail.com)
  • 2. Functional ReactiveProgramming (FRP) with reactive-banana-0.6.0.0 Heinrich Apfelmus Translated by Akira Takahashi (faithandbrave@gmail.com)
  • 3. Why? Functional Ractive Programmingは、命令的プログラムを実 装するエレガントな手法である• GUI• アニメーション• デジタルミュージック• ロボット
  • 4. How? ファーストクラスの値としての時間変化 type Behavior a = Time -> a type Event a = [(Time, a)]鍵となるデータ型BehaviorとEvent。Behavior(振る舞い)は、「時間とともに変化する値」に対応するEvent(イベント)は、「特定の時間で呼び出されたイベント」に対応する。これらを理解する方法を説明するつもりだ。もちろん、実際の実装は抽象的である。
  • 5. Behavior (振る舞い) type Behavior a = Time -> a Value (値) • 位置 – アニメーション • テキスト値 – GUI • ボリューム – 音楽 • 物理量 𝑡2 𝑦 𝑡 = 𝑦0 + 𝑦0𝑡 − 𝑔 2 Time (時間)Behaviorは時間の各ポイントに値を関連付ける。
  • 6. Behavior API instance Functor Behavior Functor instance Applicative Behavior ApplicativeどのようにしてプログラムでBehaviorを使用するか?Behavior用のAPIは、実際にはとても簡単: それらはapplicative functorである。
  • 7. Behavior API (<$>) :: (a -> b) Functor -> Behavior a -> Behavior b pure :: a -> Behavior a (<*>) :: Behavior (a -> b) Applicative -> Behavior a -> Behavior b bf <*> bx = 時間の各ポイント ¥time -> bf time $ bx timeFunctorとApplicativeに関連付けられた関数に対するリマインダ。最も重要な機能は「apply(適用)」と呼ばれ、単に時間の各ポイントで時間変化の値に時間変化の関数を適用する<*>演算子である。pure(純粋)な関数で、ある時間における一定の値を構築する
  • 8. Behavior API Double 1 a b 0 Time (時間) Time (時間) (*) <$> a <*> b Time (時間)タスクの例: 振動を減衰させる。
  • 9. Event type Event a = [(Time, a)] Value (値) • マウスクリック – GUI • 楽譜 – 音楽 • 衝突 – 物理 Time (時間)Eventは、特定のポイントで「発生」する値のコレクションである。発生は、同時に起こる可能性があり、最新のreactive-banana 0.6ではイベントの参照もできる。
  • 10. Event API Instance Functor Event Functor never :: Event a List unionWith :: (a -> a -> a) [] -> Event a -> Event a -> Event a zipWith filterE :: (a -> Bool) filter -> Event a -> Event a accumE :: a -> Event (a -> a) scanl -> Event aどのようにしてプログラムでEventを使用するか?Event APIはもう少し手がこんていますが、リスト操作に密接に関係している。
  • 11. Event API x filterE (>5) x Int Int Time (時間) Time (時間)例: filterE
  • 12. Event & Behavior API (<@>) :: Behavior (a -> b) -> Event a -> Event b 「apply」 (<@) :: Behavior b -> Event a -> Event b<@>演算子は「apply(適用)」と呼ばれ、イベントが発生する時系列関数を適用する。その弟である<@は、Behaviorから値を持つEventをタグ付けする。これはData.Functorの<$演算子に似ている。
  • 13. Event & Behavior API () e b Time Time b <@ e Time<@演算子の可視化
  • 14. Frameworks (GUI, ...) data NetworkDesctiption t a fromAddHandler Eventのインポート fromPoll Behaviorのインポート reactimate Eventのエクスポート changes BehaviorからEventを取得これまで説明したAPIは、既存のEventとBehaviorを新しいものに結合できるが、最初の場所ではそれらを取得する方法を教えてはくれない。そのため、wxHaskellのような外部フレームワークをバインドする必要がある。Reactive.Banana.FrameworksのNetworkDescriptionモナドはこれができる。これはそれほど興味深いモナドではない。これは単なるdevice for bookkeepingで、いくつかの種類のシンタックスシュガーを使うことをお勧めする。

×