-
Notifications
You must be signed in to change notification settings - Fork 0
chapter03 各Verの説明とTips
righ1113 edited this page Apr 26, 2020
·
5 revisions
- C言語のソースから愚直にHaskellに移植したもの。
- 未完成のままver1_srcに移行する。
- 破壊的代入をやめて
Lens
を使う。 - かなり強引にrules7HS.txt, unavoidableHS.txtを読み込んでいる。
- これも未完成のままver2srcに移行する。
- stackで開発する。
- これも未完成のままver3srcに移行する。
- miniEgisonを導入する。
(現状match
式をif
式の代わりにしか使っていない) - これも未完成のままver4srcに移行する。
- モナド変換子を使う。
- ガードを多用する。
- Arrowの導入は見送った。
Lens
とは、タプルやリストやレコードに対しgetterやsetterを提供するものである。
- 参考記事(新しいタブで開いてください)
Lensで行こう! - Just $ A sandbox
Lensを使うぜ! - モナドとわたしとコモナド
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
を復活させた。
Haskellにはbreak
やcontinue
がない。以下を参考にした。
- 参考記事(新しいタブで開いてください)
break可能なループを書こう - 関数型プログラミングのテクニック - Qiita