Skip to content

chapter03 各Verの説明とTips

righ1113 edited this page Apr 26, 2020 · 5 revisions



ver0_src

  • C言語のソースから愚直にHaskellに移植したもの。
  • 未完成のままver1_srcに移行する。



ver1_src

  • 破壊的代入をやめてLensを使う。
  • かなり強引にrules7HS.txt, unavoidableHS.txtを読み込んでいる。
  • これも未完成のままver2srcに移行する。



ver2src

  • stackで開発する。
  • これも未完成のままver3srcに移行する。



ver3src

  • miniEgisonを導入する。
    (現状match式をif式の代わりにしか使っていない)
  • これも未完成のままver4srcに移行する。



ver4src

  • モナド変換子を使う。
  • ガードを多用する。
  • Arrowの導入は見送った。



Tips

Lens

Lensとは、タプルやリストやレコードに対しgetterやsetterを提供するものである。

大域脱出

C言語はreturn文を使って、どこでも大域脱出できる。

  • ver0_srcではMaybeTで実現していた。
  • ver1_srcではアルゴリズムを工夫して、大域脱出を使わないようにした。
    以下の関数を使用した。
-- 参考記事:https://mkotha.hatenadiary.org/entry/20110430/1304122048
myLoop :: (accT -> a -> (accT -> b) -> b) -> (accT -> b) -> accT -> [a] -> b
myLoop _ g acc []     = g acc
myLoop f g acc (x:xs) = f acc x $ \acc' -> myLoop f g acc' xs
  • ver2srcで改良した。
foldlCont :: (b -> a -> ContT r m b) -> b -> [a] -> ContT r m b
foldlCont = foldlM
  • ver4srcではMaybeTを復活させた。

breakcontinue

Haskellにはbreakcontinueがない。以下を参考にした。




Clone this wiki locally