HaskellでBrainfuck処理系
参考
一番キレイ
ネタバレになるので自分で実装した後に見るのが良いと思う
OOPっぽいmrsekut.icon
Haskellでもこういう考え方をするものなのか?
最初に型とmethodを用意する感じ
モナド
3個めのバージョン
2個めのバージョン
aa1ef8e
意識すること
型駆動
モナドによる引数の削減
lexer, parserとevalを分割する
IOが絡むからただのStateモナドだけでは無理な気がするmrsekut.icon
そもそもHeapとPtrでデータ型を定義するのが関数型的じゃないんだよなmrsekut.icon
こうすると2つの値のみで状態を管理できるが、必ずインデックスアクセスが必要になる
ex. heap内のptrが指している値に関数fを適用して、新しいheapを作る
代替案
front :: [Int]、current :: Int, back :: [Int]と分ける
課題
BraceMapがきもい
addIdxもきもい
配列の要素アクセス!!をいまだに使っている
runがなんかキモい
最初のバージョン
2e3151e
感想
Haskell力なさすぎて泣いたmrsekut.icon
最初のバージョンなのでできるだけモナドとか使わないように書いていこうという感じはあったが、それでも我ながらひどい
言い訳すると、Goとかで書かれた実装を参考に作ったので手続き的思考に引っ張られた
課題
引数が多い
型をうまく使えていない
配列の要素アクセス!!の乱用
braceMapで、[と対応する]のMapを作っているが、冗長
Mapの中に(a,b)と(b,a)を両方入れているのでかなり冗長
入れ子でinsertを2回やってる
次にやること
Stateモナドを仕様
Data.Sequenceとは
8つの命令を型で表現