{- || --
今日も今日とてHaskell!!
この間C言語で書いたコメント削除のプログラム
あれをHaskellで書きなおしてみた
といっても、Haskell版なので、
対応しているコメントは、
{- ............... -}
と、
-
- ...................
ですけどね。
import IO main = do handle <- openFile "comment.hs" ReadMode fs <- hGetContents handle putStr $ delcomment fs hClose handle delcomment :: String -> String delcomment (_:[]) = "" delcomment (a:b:fs) | a == '{' && b == '-' = delcomment $ delcomment' fs | a == '-' && b == '-' = delcomment $ delcomment'' fs | otherwise = a:(delcomment (b:fs)) where delcomment' (_:[]) = "" delcomment' (x:y:ys) | x == '-' && y== '}' = ys | otherwise = delcomment' (y:ys) delcomment'' [] = "" delcomment'' (x:xs) = if x == '\n' then xs else delcomment'' xs
delcomment系関数を全部ひとまとめにしたかったけど、
where節を使って、
delcommentに対する二つの従属関数を定義しています。
従属関数なので返り値も勿論String。
まあ、自分の中で決めたルールですけど。
ただ、今回のように小規模で、一見して構造がすぐつかめる程度ならこれでもいいけれど、そうでない場合はソースファイル分けるなどをしてでも、
従属関数であってもちゃんと定義書くべきでしょうね。
とりあえず、これだけのコードですが、[]処理もしているし、すべてのHaskellソースコードに対して機能します。
実際、自分の持っているコードに対して実行したらちゃんと上手くいった。
ただ、類似処理が多いからもっと綺麗に書けると思うんだけどな。
うーむ
でも、前書いたC言語のものよりこっちの方がどういう処理をしているか、見易いですね☆
ただ、今思ったけど、Parsec使えば圧倒的に短く書けるんじゃ......