IO モナドにハマってますヽ(  ̄д ̄;)ノ - 女子高生ぷろぐらまーなお☆のブログ

id:nobsunさんがとあるプログラム - HaHaHa!(old) - haskellで書いてくださっているので、僕が書くのはおせっかいな気がしますが、まぁ参考まで。んー、あんまりid:nobsunさんと変わらないかも(id:nobsunさんのは、setCurrentDirectoryが一箇所足りないような気がします…)。
あ、このプログラムはWindows限定です。パスセパレータの処理をサボっています。

module Main (main) where

import Data.List (isSuffixOf)
import System.Directory (getModificationTime,
                         getDirectoryContents)
import System.Environment (getArgs)
import System.Time (ClockTime)

data Entry = Entry {
      path      :: FilePath,
      timestamp :: ClockTime,
      title     :: String,
      body      :: [String]
    } deriving Show

getFileEntry :: FilePath -> FilePath -> IO Entry
getFileEntry dir file = do
    let path = dir ++ "\\" ++ file
    mtime <- getModificationTime path
    cs    <- readFile path
    return $ case lines cs of
               []       -> Entry path mtime "" []
               (t : bs) -> Entry path mtime t  bs

getTextFileEntries :: FilePath -> String -> IO [Entry]
getTextFileEntries dir ext = 
  mapM (getFileEntry dir) . filter (isSuffixOf ext) =<<
    getDirectoryContents dir

main :: IO ()
main = mapM_ (putStrLn . title) =<< 
         (uncurry getTextFileEntries) . parseArgs =<< getArgs
    where
      parseArgs []              = ("data", ".txt")
      parseArgs [dir]           = (dir,    ".txt")
      parseArgs (dir : ext : _) = (dir,    '.' : ext)