Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

状態遷移機械を構成するための新しいイベントコンビネーターの提案(PPL2014 カテ3ポスター)

2,471 views

Published on

PPL2014のカテ3ポスター。

Published in: Technology
  • Login to see the comments

  • Be the first to like this

状態遷移機械を構成するための新しいイベントコンビネーターの提案(PPL2014 カテ3ポスター)

  1. 1. 状態遷移機械を構成するための新しい イベントコンビネーターの提案 (PPL2014 カテ3ポスター) 2014年3月7日 小笠原 Copyright© 2013 IT Planning,Inc All rights reserved. 啓
  2. 2. 既存のイベントコンビネーター達  map:’a event -> (‘a -> ‘b) -> ‘b event   merge:’a event list -> ‘a event   イベントを条件に適合するもののみに限定。 until:’a event -> ‘b event -> ‘b event   二つのイベントの括りだし。 filter:’a event -> (‘a -> bool) -> ‘a event   畳み込み変換 zip: ‘a event -> ‘b event -> (‘a, ‘b) event   発生しないイベント。 fold: (‘a -> ‘b -> ‘a) -> ‘a -> ‘b event -> ‘a event   重ね合わせる。 never: ‘a event   変換する。 条件が満たされている間イベントを取得。 switch: ‘a event event -> ‘a event  イベントのイベントを使ってイベントを切り替える。
  3. 3. SWITCHコンビネーターの動作イメージ switch eeの挙動 ‘a event event ‘a event e v, v, v, v, v, v, …. e’ v, v, v, v, …. 1. 2. 3. ‘a event eventからイベントeが発生す る。 eで発生したイベント値vがswitch ee のイベント値として観測される。 次のイベントe’が発生したら、e’の発 生させたイベント値vがswitch eeのイ ベント値として観測される。
  4. 4. SWITCHコンビネーターの利用法  let (>>=) m f = switch (map f m)とすると、ドラッグ アンドドロップイベント(画面内)は次のように記述 できる。 mouseDown >>= (fun _ → E.until mouseUp mouseMove) と書ける。mouseDownの後、mouseUpがあるまで mouseMoveを観測イベントと解釈できる。  この例では、(>>=)は「~イベントが起きた後に」 のような意味を実現している。 
  5. 5. SWITCHの誤用  キーボードイベントから↑↑↓↓←→BAを取りたいとする と? 同じイベントをswitchすると、 key >>= 両方切り替わってしまって「~イベントの (fun k → 後で」という意味を作れなくなってしまう。 if k <> UP then never else key >>= (fun k → if k <> UP then never else key >>= (fun k → if k <> DOWN then never else key >>= …. )))  (>>=)の左側と無名関数内部に同じイベントを使っても、 「~イベントの後で」を意味するコンビネーターは作れ ないか?
  6. 6. 新しいイベントコンビネーターの提案  nswitch: ‘a event event -> ‘a event 型はswitchと同じ。  イベントのイベントからイベントeが発生したら、eが終わる まで次のイベントに切り替わらないswitch。  このコンビネーターを使ってnswitch (map f m)を定義する と、↑↑↓↓←→BAを先の作り方で作れるようになる。   choose: ‘a event list -> ‘a event 型はmergeと同じ。  指定されたイベントのリストの中で最初に発生したイベント eが終わるまでそのイベントの発生を取り続け、リストの中 の残りのイベント発生は無視し、eが終わったら次に発生し たイベントをまた終わるまで取るという挙動をする。  このコンビネーターがあれば、互いに排他的なイベントを作 ることができ、nswitchと合わせて状態遷移機械を簡潔に記述 できるようになる。 
  7. 7. 簡略電卓の状態遷移図 メモリ1とメモリ2の演算 数字(0から9)と 演算子(+のみ)が ある電卓を考える。  数字が押されたらメ モリ1に数字を追加 する(メモリ*10+押 された数字)  演算子が押されたら メモリ1とメモリ2 で演算する。  演算子(+) 演算子(+) 数字押下 数字押下 123 メモリ1 初期状態 0 兼 メモリ2 数字追加状態
  8. 8. NSWITCH, CHOOSEによる簡略電卓の実装 let memory1event = E.choose [ op >>= (fun _ -> E.once number); E.map (fun n -> (S.read m2) * 10 + n) number; ] メモリ1とメモリ2 の挙動をイベント コンビネーターの 組み合わせで表 現。  nswitchとchoose のおかげでフラグ 一切不要。  let memory2event = let calc o = o (S.read m1) (S.read m2) in op >>= (fun o -> E.cons (calc o) (E.map calc op) +> E.until number)
  9. 9. まとめ switchは「~イベントの後で」という意味をあらわ さない場合がある。  nswitchやchooseを使うと状態遷移機械を背後に持 つ状態の動作を簡潔に記述できる。 

×