にゃははー

はへらー

パラダイム

最近関数型言語を勉強している。Common Lisp,Grass,Haskellを主にやっている。

今まで手続き型のC/C++を扱ってきたからまだうまく馴染めていない。
C/C++だとこう書くんだけど、関数型だとどう書けばいいのだろうと言う場面が非常に多かった。特に純粋関数型なHaskellだとまだIO()といったモナドがうまく使えない。型も強いし。
一方Common Lispは型無しラムダに近いし、オブジェクト指向がなかなか強い関係上意外と書けている。

GrassのインタプリタHaskellで書き直してみると言う試みを元に勉強するのはさすがに無理があったのだろうか。でもCommon Lispだと何とか書けてたし…

ちなみに今詰まってるのはコードがこんな感じ。

serialCount :: String -> (Int, String)
serialCount [] = (0, [])
serialCount str = serialCharCount (head str) str
  where
    serialCharCount :: Char -> String -> (Int, String)
    serialCharCount _ [] = (0, [])
    serialCharCount chr (c:cs)
      | chr == c = let ret = serialCharCount chr cs
                   in (succ (fst ret), (snd ret))
      | otherwise = (0, [c] ++ cs)

って定義があったら

parseGrass :: String -> IO ()
parseGrass [] = putStr ""
parseGrass code = let count = serialCount code
                  in putStrLn ([head code] ++ " " ++ show (fst count))
                     parseGrass (snd count)

こんな感じなのを動かしたいんだけど、やっぱり通らなくてorz。
まぁ入門書の1章しか読まないとこんなもんですよ。Haskellerの皆さん叩いてくだしあ。