Created
October 11, 2015 15:57
-
-
Save bennylope/02b2ec6673d0a4840d17 to your computer and use it in GitHub Desktop.
Example #1: TODO program from Gabriel Gonzalez's Basic Haskell Examples
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- From http://www.haskellforall.com/2015/10/basic-haskell-examples.html | |
putTodo :: (Int, String) -> IO () | |
putTodo (n, todo) = putStrLn (show n ++ ": " ++ todo) | |
prompt :: [String] -> IO () | |
prompt todos = do | |
putStrLn "" | |
putStrLn "Current TODO list:" | |
mapM_ putTodo (zip [0..] todos) | |
command <- getLine | |
interpret command todos | |
interpret :: String -> [String] -> IO () | |
interpret ('+':' ':todo) todos = prompt (todo:todos) | |
interpret ('-':' ':num ) todos = | |
case delete (read num) todos of | |
Nothing -> do | |
putStrLn "No TODO entry matches the given number" | |
prompt todos | |
Just todos' -> prompt todos' | |
interpret "q" todos = return () | |
interpret command todos = do | |
putStrLn ("Invalid command: `" ++ command ++ "`") | |
prompt todos | |
delete :: Int -> [a] -> Maybe [a] | |
delete 0 (_:as) = Just as | |
delete n (a:as) = do | |
let n' = n - 1 | |
as' <- n' `seq` delete n' as | |
return (a:as') | |
delete _ [] = Nothing | |
main = do | |
putStrLn "Commands:" | |
putStrLn "+ <String> - Add a TODO entry" | |
putStrLn "- <Int> - Delete the numbered entry" | |
putStrLn "q - Quit" | |
prompt [] |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment