リストのフラット化

http://karetta.jp/article/blog/oneline/013581より。今ひとつ題意が掴めてません。あとParsec使ったぜ?

import Text.ParserCombinators.Parsec

data Exp = Exp Char | End

type Row = [Exp]

instance Show Exp where
    show (Exp c) = c:" "
    show End     = ""

s_exp = do
    exs <- (try (char '0') >> return [Exp '0']) <|> s_list
    return exs

s_list = do
    char '('
    row <- s_row
    char ')'
    return row

s_row = do
    ex1 <- s_exp
    row <- (try spaces >> s_row) <|> return [End]
    return $ ex1 ++ row

t_exp = do
    ex1 <- t_val
    row <- (try spaces >> t_exp) <|> return [End]
    return $ ex1:row

t_val =  (try (char '0') >> return (Exp '0'))
             <|> (char '1' >> return (Exp '1'))

s2t = init . concatMap show . run s_exp

run f s = case runParser f "" "" s of
            Right x -> x
            Left _  -> error "Parse Error!"