Subscribed unsubscribe Subscribe Subscribe

SICPのデジタル回路のシミュレータをFRPで書いた

Haskell FRP

最近FRPなコードを書いているので、ふとid:kazu-yamamotoさんに言われたのを思い出して書いてみました。元の問題はこちらからどうぞ。今回はelereaというライブラリを使っています。

FRPとはなんぞやな方はやさしいFunctional reactive programming(概要編) - maoeのブログを読むと雰囲気はわかるかもしれません。

コードは大まかに解説すると、

  • main
    • 各部品の遅延を決めて
    • SICPの例にあった入力(Signal Bool)を組み立てて回路に入力として与える
    • replicateM_ 20でsampleを実行しているところで実際に回路が動く
  • Circuitモナド
    • 単なるReaderモナドインバータなど各部品の持つ遅延を初期値として与えるために使ってる
    • ベースのSignalGenモナドはelereaが提供しているもので、ステートフルなSignalを作るために使われる
  • 回路の記述
    • Signalを受け取りSignalを返す関数になってる
    • SignalGenやCircuitはモナドになってるので、普通にdo記法で回路図の通りに書ける

といった感じです。

Signalというのは、なんぞやの文でいうBehaviourのことです。この例題は回路が動的に変わったりしないのでFRP的にはあまり面白くない例ですが、SICPでは手続き的だった流れが、カンスウガタっぽく書けていると思います。

ところで、Haskell界隈のFRPの状況はやさしいFunctional reactive programming(概要編) - maoeのブログを書いたときからだいぶ変わってきていて、当時最新だったreactiveはメンテされなくなり、変わって新しいライブラリが現れました。

elerea以外で代表的なものは

などです。

redditなどでもたびたび話題に上がってきて盛り上がっているので、この機会に触ってみると面白いと思います。