Workshop/MiracleHaskell/017

日時

2012/10/12

内容

http://learnyouahaskell.com/input-and-output#command-line-arguments から再開します。

宿題

前回以下のようなソースコードでTODOリストアプリケーションを作りました。 しかし、このプログラムはエラー処理が不足していて、利用者にわかりずらいエラーメッセージが出力されてしまいます。 このプログラムにエラー処理を追加して、もっとわかりやすいエラーメッセージを吐かせてみましょう。

import System.Environment   
import System.Directory  
import System.IO  
import Data.List  
  
dispatch :: [(String, [String] -> IO ())]  
dispatch =  [ ("add", add)  
            , ("view", view)  
            , ("remove", remove)  
            ]  
   
main = do  
    (command:args) <- getArgs  
    let (Just action) = lookup command dispatch  
    action args  
  
add :: [String] -> IO ()  
add [fileName, todoItem] = appendFile fileName (todoItem ++ "\n")  
  
view :: [String] -> IO ()  
view [fileName] = do  
    contents <- readFile fileName  
    let todoTasks = lines contents  
        numberedTasks = zipWith (\n line -> show n ++ " - " ++ line) [0..] todoTasks  
    putStr $ unlines numberedTasks  
  
remove :: [String] -> IO ()  
remove [fileName, numberString] = do  
    handle <- openFile fileName ReadMode  
    (tempName, tempHandle) <- openTempFile "." "temp"  
    contents <- hGetContents handle  
    let number = read numberString  
        todoTasks = lines contents  
        newTodoItems = delete (todoTasks !! number) todoTasks  
    hPutStr tempHandle $ unlines newTodoItems  
    hClose handle  
    hClose tempHandle  
    removeFile fileName  
    renameFile tempName fileName

ヒント

簡単に使ってみるだけでも、よくわからないエラーがみつかります。

$ ghc TodoList.hs
$ ./TodoList
TodoList: user error (Pattern match failure in do expression at TodoList.hs:13:5-18)
$ ./TodoList help
TodoList: TodoList.hs:14:9-47: Irrefutable pattern failed for pattern (Data.Maybe.Just action)