Functional Reactive Programming でテトリスを書いてみる(2) [Haskell]
前回は基本的なデータ型を定義し,テトリスのフィールドを表示させた.
入力
キー入力によって動作が変わるようにしたい.
一旦テトリスを離れる.
newtype Input = Get Char inputEvent :: IO (Event Input) echo :: Event Input -> Event Output echo i = (\(Get c) -> Put c) <$> i main = do hSetEcho stdin False input <- inputEvent run $ echo input
インターフェースとしては,inputEventから得た入力イベントを出力イベントに変換する形にする.
Functional Reactive Programming でテトリスを書いてみる(1) [Haskell]
FRP(Functional Reactive Programming)というスタイルがある.入力から出力を得る(あらゆる)プログラムを関数風に表現する手法らしい.遅延ストリームは純粋関数型言語にぴったりだと感じるが,あまり流行っていないような気がする.
HaskellではFRPのライブラリが複数あるそうだが,よく分からないのでボトムアップに自作してみよう.ゲームといえば入出力と内部状態の塊,楽しそうなのでCUIで動くテトリスを題材とする.
基本
FRPにはEventとBehaviorという概念がある.
Eventは,時間と値の組のリストで,離散的なイベントを表す.例えば,キーが押されたというイベント,画面が更新されたというイベントなど.
Behaviorは時間の関数で,連続的な値を表す.例えば,経過時間や現在のスコアなど.
type Time = Double newtype Event a = Event [(Time, a)] newtype Behavior a = Behavior (Time -> a)
ブログはじめました
ゆるくやっていこうと思います.