SlideShare a Scribd company logo
1 of 14
Download to read offline
Functional Reactive
Programming (FRP)
 with reactive-banana-0.6.0.0




        Heinrich Apfelmus



          Translated by Akira Takahashi (faithandbrave@gmail.com)
Functional Reactive
Programming (FRP)
 with reactive-banana-0.6.0.0




        Heinrich Apfelmus



          Translated by Akira Takahashi (faithandbrave@gmail.com)
Why?

    Functional Ractive Programmingは、命令的プログラムを実
    装するエレガントな手法である



•   GUI
•   アニメーション
•   デジタルミュージック
•   ロボット
How?

          ファーストクラスの値としての時間変化



       type Behavior a = Time -> a
       type Event a    = [(Time, a)]




鍵となるデータ型BehaviorとEvent。
Behavior(振る舞い)は、「時間とともに変化する値」に対応する
Event(イベント)は、「特定の時間で呼び出されたイベント」に対応する。
これらを理解する方法を説明するつもりだ。もちろん、実際の実装は抽象的である。
Behavior (振る舞い)
             type Behavior a = Time -> a

 Value (値)
                                •   位置 – アニメーション
                                •   テキスト値 – GUI
                                •   ボリューム – 音楽
                                •   物理量
                                                           𝑡2
                                        𝑦 𝑡 = 𝑦0 + 𝑦0𝑡 − 𝑔
                                                           2
                            Time (時間)




Behaviorは時間の各ポイントに値を関連付ける。
Behavior API

      instance Functor Behavior               Functor



      instance Applicative Behavior           Applicative




どのようにしてプログラムでBehaviorを使用するか?
Behavior用のAPIは、実際にはとても簡単: それらはapplicative functorである。
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 time

FunctorとApplicativeに関連付けられた関数に対するリマインダ。
最も重要な機能は「apply(適用)」と呼ばれ、単に時間の各ポイントで時間変化の値に時間変化
の関数を適用する<*>演算子である。
pure(純粋)な関数で、ある時間における一定の値を構築する
Behavior API
 Double


 1        a                        b




 0            Time (時間)                  Time (時間)

               (*) <$> a <*> b




                             Time (時間)
タスクの例: 振動を減衰させる。
Event
             type Event a = [(Time, a)]

 Value (値)
                                • マウスクリック – GUI
                                • 楽譜 – 音楽
                                • 衝突 – 物理




                            Time (時間)


Eventは、特定のポイントで「発生」する値のコレクションである。
発生は、同時に起こる可能性があり、最新のreactive-banana 0.6ではイベントの参照もできる。
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はもう少し手がこんていますが、リスト操作に密接に関係している。
Event API


             x                     filterE (>5) x

    Int                      Int




                 Time (時間)                          Time (時間)


例: filterE
Event & Behavior API
     (<@>) :: Behavior (a -> b)
           -> Event a -> Event b
                                              「apply」
     (<@) :: Behavior b
          -> Event a -> Event b




<@>演算子は「apply(適用)」と呼ばれ、イベントが発生する時系列関数を適用する。
その弟である<@は、Behaviorから値を持つEventをタグ付けする。これはData.Functorの<$演
算子に似ている。
Event & Behavior API
                            ()
                                 e
      b




                Time                    Time

                   b <@ e




                                 Time

<@演算子の可視化
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で、いくつかの種類のシンタックスシュガーを使うことをお勧めする。

More Related Content

Similar to frp tutorial

Swift 2.0 大域関数の行方から #swift2symposium
Swift 2.0 大域関数の行方から #swift2symposiumSwift 2.0 大域関数の行方から #swift2symposium
Swift 2.0 大域関数の行方から #swift2symposiumTomohiro Kumagai
 
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例Yoshifumi Kawai
 
React+redux+saga 03
React+redux+saga 03React+redux+saga 03
React+redux+saga 03TIS Inc
 
LaravelでAPI定義を管理する
LaravelでAPI定義を管理するLaravelでAPI定義を管理する
LaravelでAPI定義を管理するKenjiro Kubota
 
UniRx勉強会 reactive extensions inside(公開用)
UniRx勉強会   reactive extensions inside(公開用)UniRx勉強会   reactive extensions inside(公開用)
UniRx勉強会 reactive extensions inside(公開用)wilfrem
 
Fundamentals of Swift & Redux (ReduxとSwiftの組み合わせ)
Fundamentals of Swift & Redux (ReduxとSwiftの組み合わせ)Fundamentals of Swift & Redux (ReduxとSwiftの組み合わせ)
Fundamentals of Swift & Redux (ReduxとSwiftの組み合わせ)Fumiya Sakai
 
イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化Gosuke Miyashita
 

Similar to frp tutorial (13)

Swift 2.0 大域関数の行方から #swift2symposium
Swift 2.0 大域関数の行方から #swift2symposiumSwift 2.0 大域関数の行方から #swift2symposium
Swift 2.0 大域関数の行方から #swift2symposium
 
Apache Arrow
Apache ArrowApache Arrow
Apache Arrow
 
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
 
React+redux+saga 03
React+redux+saga 03React+redux+saga 03
React+redux+saga 03
 
react勉強会 #4
react勉強会 #4react勉強会 #4
react勉強会 #4
 
Ajax 応用
Ajax 応用Ajax 応用
Ajax 応用
 
LaravelでAPI定義を管理する
LaravelでAPI定義を管理するLaravelでAPI定義を管理する
LaravelでAPI定義を管理する
 
たのしい関数型
たのしい関数型たのしい関数型
たのしい関数型
 
UniRx勉強会 reactive extensions inside(公開用)
UniRx勉強会   reactive extensions inside(公開用)UniRx勉強会   reactive extensions inside(公開用)
UniRx勉強会 reactive extensions inside(公開用)
 
Fundamentals of Swift & Redux (ReduxとSwiftの組み合わせ)
Fundamentals of Swift & Redux (ReduxとSwiftの組み合わせ)Fundamentals of Swift & Redux (ReduxとSwiftの組み合わせ)
Fundamentals of Swift & Redux (ReduxとSwiftの組み合わせ)
 
Apache geode at-s1p
Apache geode at-s1pApache geode at-s1p
Apache geode at-s1p
 
HTML5&API総まくり
HTML5&API総まくりHTML5&API総まくり
HTML5&API総まくり
 
イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化
 

More from Akira Takahashi (20)

Cpp20 overview language features
Cpp20 overview language featuresCpp20 overview language features
Cpp20 overview language features
 
Cppmix 02
Cppmix 02Cppmix 02
Cppmix 02
 
Cppmix 01
Cppmix 01Cppmix 01
Cppmix 01
 
Modern C++ Learning
Modern C++ LearningModern C++ Learning
Modern C++ Learning
 
cpprefjp documentation
cpprefjp documentationcpprefjp documentation
cpprefjp documentation
 
C++1z draft
C++1z draftC++1z draft
C++1z draft
 
Boost tour 1_61_0 merge
Boost tour 1_61_0 mergeBoost tour 1_61_0 merge
Boost tour 1_61_0 merge
 
Boost tour 1_61_0
Boost tour 1_61_0Boost tour 1_61_0
Boost tour 1_61_0
 
Boost tour 1.60.0
Boost tour 1.60.0Boost tour 1.60.0
Boost tour 1.60.0
 
Boost container feature
Boost container featureBoost container feature
Boost container feature
 
Boost Tour 1_58_0 merge
Boost Tour 1_58_0 mergeBoost Tour 1_58_0 merge
Boost Tour 1_58_0 merge
 
Boost Tour 1_58_0
Boost Tour 1_58_0Boost Tour 1_58_0
Boost Tour 1_58_0
 
C++14 solve explicit_default_constructor
C++14 solve explicit_default_constructorC++14 solve explicit_default_constructor
C++14 solve explicit_default_constructor
 
C++14 enum hash
C++14 enum hashC++14 enum hash
C++14 enum hash
 
Multi paradigm design
Multi paradigm designMulti paradigm design
Multi paradigm design
 
Start Concurrent
Start ConcurrentStart Concurrent
Start Concurrent
 
Programmer mind
Programmer mindProgrammer mind
Programmer mind
 
Boost.Study 14 Opening
Boost.Study 14 OpeningBoost.Study 14 Opening
Boost.Study 14 Opening
 
Executors and schedulers
Executors and schedulersExecutors and schedulers
Executors and schedulers
 
Improvement future api
Improvement future apiImprovement future api
Improvement future api
 

frp tutorial

  • 1. Functional Reactive Programming (FRP) with reactive-banana-0.6.0.0 Heinrich Apfelmus Translated by Akira Takahashi (faithandbrave@gmail.com)
  • 2. Functional Reactive Programming (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 time Functorと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で、いくつかの種類のシンタックスシュガーを使うことをお勧めする。