すごいHaskellたのしく学ぼう! 9.5 写経と課題
- 作者: Miran Lipovača,田中英行,村主崇行
- 出版社/メーカー: オーム社
- 発売日: 2012/05/23
- メディア: 単行本(ソフトカバー)
- 購入: 25人 クリック: 580回
- この商品を含むブログ (67件) を見る
通称:すごいH本
上記書籍の「9.5 ToDoリストをもっと楽しむ」に記載されているコードの写経と課題を行いましたので記載します。
写経
195ページのコードを写経しました。
import System.Environment import System.Directory import System.IO import Data.List import Control.Exception --書籍掲載なし dispatch :: String -> [String] -> IO () dispatch "add" = add dispatch "view" = view dispatch "remove" = remove dispatch "bump" = bump main = do (command:argList) <- getArgs dispatch command argList 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 contents <- readFile fileName let todoTasks = lines contents numberedTasks = zipWith (\n line -> show n ++ " - " ++ line) [0..] todoTasks putStrLn "These are your To-Do items:" mapM_ putStrLn numberedTasks let number = read numberString newTodoItems = unlines $ delete (todoTasks !! number) todoTasks bracketOnError (openTempFile "." "temp") (\(tempName, tempHandle) -> do hClose tempHandle removeFile tempName) (\(tempName, tempHandle) -> do hPutStr tempHandle newTodoItems hClose tempHandle removeFile fileName renameFile tempName fileName)
import Control.Exception
bracketOnError が Control.Exception モジュールに定義されているため必要です。
課題
196ページで読者課題となっているbump関数の実装を行いました。
import System.Environment import System.Directory import System.IO import Data.List import Control.Exception dispatch :: String -> [String] -> IO () dispatch "add" = add dispatch "view" = view dispatch "remove" = remove dispatch "bump" = bump main = do (command:argList) <- getArgs dispatch command argList 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 contents <- readFile fileName let todoTasks = lines contents numberedTasks = zipWith (\n line -> show n ++ " - " ++ line) [0..] todoTasks putStrLn "These are your To-Do items:" mapM_ putStrLn numberedTasks let number = read numberString newTodoItems = unlines $ delete (todoTasks !! number) todoTasks bracketOnError (openTempFile "." "temp") (\(tempName, tempHandle) -> do hClose tempHandle removeFile tempName) (\(tempName, tempHandle) -> do hPutStr tempHandle newTodoItems hClose tempHandle removeFile fileName renameFile tempName fileName) bump :: [String] -> IO () bump [fileName, numberString] = do contents <- readFile fileName let todoTasks = lines contents numberedTasks = zipWith (\n line -> show n ++ " - " ++ line) [0..] todoTasks putStrLn "These are your To-Do items:" mapM_ putStrLn numberedTasks let number = read numberString bumpingItem = todoTasks !! number newTodoItems = unlines $ bumpingItem : delete (bumpingItem) todoTasks bracketOnError (openTempFile "." "temp") (\(tempName, tempHandle) -> do hClose tempHandle removeFile tempName) (\(tempName, tempHandle) -> do hPutStr tempHandle newTodoItems hClose tempHandle removeFile fileName renameFile tempName fileName)
最後に
・コードの重複
・画面表示がいまいち(remove/dump後の結果表示がないなど)
・異常な入力値の処理
などなど不十分な部分が多いですが、機能実装までになります。