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

2,151 views

Published on

PPL2014のカテ3ポスター。

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
2,151
On SlideShare
0
From Embeds
0
Number of Embeds
81
Actions
Shares
0
Downloads
6
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

状態遷移機械を構成するための新しいイベントコンビネーターの提案(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を使うと状態遷移機械を背後に持 つ状態の動作を簡潔に記述できる。 

×