I am working through UPenn CIS 194: Introduction to Haskell (Spring 2013). Since I am not able to take the course for real I am asking for CR (feedback) as it could be from teacher in that course.
HW2 - Log file parsing - Full description
{-# OPTIONS_GHC -Wall #-} module LogAnalysis where import Log parseMessage :: String -> LogMessage parseMessage x = case words x of "E":s:t:m -> LogMessage (Error (read s::Int)) (read t::Int) (unwords m) "W":t:m -> LogMessage Warning (read t::Int) (unwords m) "I":t:m -> LogMessage Info (read t::Int) (unwords m) r -> Unknown (unwords r) parse :: String -> [LogMessage] parse x = case lines x of f:xs -> [parseMessage f] ++ parse (unlines xs) [] -> [] insert :: LogMessage -> MessageTree -> MessageTree insert (Unknown _) t = t insert m Leaf = (Node Leaf m Leaf) insert message@(LogMessage _ t1 _) (Node l root@(LogMessage _ t2 _) Leaf) | t1 > t2 = (Node l root (Node Leaf message Leaf)) insert message@(LogMessage _ t1 _) (Node Leaf root@(LogMessage _ t2 _) r) | t1 <= t2 = (Node (Node Leaf message Leaf) root r) insert message@(LogMessage _ t1 _) (Node l root@(LogMessage _ t2 _) r) | t1 > t2 = (Node l root (insert message r)) | otherwise = (Node (insert message l) root r) build :: [LogMessage] -> MessageTree build [] = Leaf build (x:xs) = insert x (build xs) inOrder :: MessageTree -> [LogMessage] inOrder Leaf = [] inOrder (Node left message right) = (inOrder left) ++ [message] ++ (inOrder right) whatWentWrong :: [LogMessage] -> [String] whatWentWrong log = (filterEmpty (errorsWithSeverity50 (inOrder (build log)))) errorWithSeverity :: LogMessage -> Int -> String errorWithSeverity (LogMessage (Error s) _ m) severity | s >= severity = m | otherwise = "" errorWithSeverity _ _ = "" errorsWithSeverity50 :: [LogMessage] -> [String] errorsWithSeverity50 [] = [] errorsWithSeverity50 (x:xs) = [(errorWithSeverity x 50)] ++ errorsWithSeverity50 xs filterEmpty :: [String] -> [String] filterEmpty [] = [] filterEmpty ("":xs) = filterEmpty xs filterEmpty (x:xs) = [x] ++ filterEmpty xs