Smartphonemaoeのブログこの広告は、90日以上更新していないブログに表示しています。このエントリは書きかけです。前回はHaskellのFRPライブラリのreactiveについて取り上げ、Eventの使い方を紹介しました。今回はFRPにおいてEventと並んで重要なBehaviorを見ていきます。BehaviorとはBehaviorについては前回触れましたが、再度おさらいしておきます。意味は、それぞれ次のように与えられます。Behaviorは時間の関数です。時間とともに変化する値を表現できます。Behaviorの最大の特徴はそれが連続的な時間を扱えることです。Eventは特定の時間とそのときの値をペアにしたものなので、扱う時間は離散的ですが、Behaviorは任意の時間の値が得られます。連続的な時間を扱うことでプログラムがシンプルになります。time?に良くまとまっています。Behaviorの性質と使い方を理解するためにサンプルコードを見ていきましょう。正弦波のアニメーション(SinWave.hs)連続的に変化する値として正弦波を挙げます。ターミナルに正弦波を描いてみましょう。TimeIを使ってみます。ソースコードはTime.hsです。timeは時間を受け取り時間を返す、いわばid関数です。[0..]このプログラムは1秒ごとに端末に時間*1を表示します。注目すべきポイントはsnapshot_です。型と名前から推測できるように、BehaviorをEvent発火のタイミングでサンプリングしています。上の例では、時間を表すtimeを0秒から1秒ごとにサンプリングして、出てきた値をEventとして返しています。出力部分は前回のEventで取り上げた例と全く同じです。この例からわかるように、Behaviorは連続的な時間を扱いますが、出力などプログラムの最終段階では離散的な時間へと変換されます。それでは、正弦波はどう表されるのか見てきます。timeのところに注目です。前回のEvent同様、BehavirもApplicativeのインスタンスになっています。functorを使ってBehavior上の計算に持ち上げることができます。<$>を使うと、Behaviorの計算をまるで普通の関数適用をしているかのように自然に書けることがわかります。Doubleを棒グラフに変換するところです。Stringであることがわかります。実際に動かしてみましょう。######################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################綺麗に正弦波を描くことができました。インタラクティブなBehavior(SinWaveI.hs)続いてBehaviorとユーザの入力を連携させてみます。今度はプログラムを起動してから、ユーザが何かキー入力するたびに、下記の挙動を切り替えていくというものです。正弦波を描く定数を描く別の定数を描くコードを見てみましょう。..]sinWaveが所望の動作を表現しているところです。インタラクティブなBehaviorの要であるswitcher関数が出てきました。switcherの型は次のようになっています。aドキュメントにはわかりやすくこう書かれています。aswitcherは、初期値となる最初のBehaviorと、次のBehaviorを値にもつEventを受け取り、それらを合成したBehaviorを返します。sinWaveでは初期BehaviorはsinBで、続くBehaviorはnextとなっています。onceというのはEventをリストと考えると、headに相当するものと考えてください。restEはtail相当です。[0..]*1:reactiveで扱う時間は絶対的な時刻ではなく、プログラム起動時からの相対的な時間(秒数)です。偏りのないコインを投げつづけよう。