frp tutorial

  • 2,398 views
Uploaded on

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
2,398
On Slideshare
0
From Embeds
0
Number of Embeds
6

Actions

Shares
Downloads
2
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で、いくつかの種類のシンタックスシュガーを使うことをお勧めする。