wvogel日記

自分用の技術備忘録が多めです.

{- || --

今日も今日とて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使えば圧倒的に短く書けるんじゃ......