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)