-
Notifications
You must be signed in to change notification settings - Fork 2
HW 2 init #5
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: amos
Are you sure you want to change the base?
HW 2 init #5
Changes from 1 commit
60d0e92
36d6fab
a93524d
a04e954
d1fce6f
5a7db0a
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -6,22 +6,44 @@ module Cis194.Hw.LogAnalysis where | |
import Cis194.Hw.Log | ||
|
||
parseMessage :: String -> LogMessage | ||
parseMessage s = Unknown s | ||
parseMessage s = | ||
case words s of | ||
"E":i:ws -> buildMessage (Error (read i)) ws | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
"I":ws -> buildMessage Info ws | ||
"W":ws -> buildMessage Warning ws | ||
_ -> Unknown s | ||
|
||
buildMessage :: MessageType -> [String] -> LogMessage | ||
buildMessage m (t:ws) = LogMessage m (read t) (unwords ws) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If your function only makes sense for non-empty lists, it can be better to instead take the first element as a distinct argument: buildMessage :: MessageType -> String -> [String] -> LogMessage and then put the logic for what to do when you don't have one in the caller "W":w:ws -> buildMessage Warning w ws |
||
|
||
parse :: String -> [LogMessage] | ||
parse _ = [] | ||
parse = map (parseMessage) . lines | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Drop the parentheses |
||
|
||
insert :: LogMessage -> MessageTree -> MessageTree | ||
insert (Unknown _) t = t | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As written this pattern is just fine, but a neat thing you can use is record constructor syntax to match a constructor where you don't care about any of its fields. This pays off more for constructors with more fields: insert Unknown{} t = t |
||
insert l Leaf = Node Leaf l Leaf | ||
insert n@(LogMessage _ nt _) (Node l m@(LogMessage _ mt _) r) | ||
| nt < mt = Node (insert n l) m r | ||
| nt > mt = Node l m (insert n r) | ||
insert _ t = t | ||
|
||
build :: [LogMessage] -> MessageTree | ||
build _ = Leaf | ||
build = foldr insert Leaf . reverse | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
|
||
inOrder :: MessageTree -> [LogMessage] | ||
inOrder _ = [] | ||
inOrder (Node l m r) = inOrder l ++ [m] ++ inOrder r | ||
inOrder Leaf = [] | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This implements the algorithm as specified, but it is somewhat inefficient to left-nest inOrder :: MessageTree -> [LogMessage]
inOrder t = go t []
where
go (Node l m r) = inOrder l . (m:) . inOrder r
go Leaf = id This pattern is captured by the dlist package as well as the |
||
|
||
-- whatWentWrong takes an unsorted list of LogMessages, and returns a list of the | ||
-- messages corresponding to any errors with a severity of 50 or greater, | ||
-- sorted by timestamp. | ||
whatWentWrong :: [LogMessage] -> [String] | ||
whatWentWrong _ = [] | ||
whatWentWrong = map getString . filter isSever . inOrder . build | ||
|
||
isSever :: LogMessage -> Bool | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. severe :-) |
||
isSever (LogMessage (Error s) _ _) = s >= 50 | ||
isSever _ = False | ||
|
||
getString :: LogMessage -> String | ||
getString (LogMessage _ _ s) = s | ||
getString (Unknown s) = s |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
A note about a flaw in this exercise:
LogMessage
shouldn't have anUnknown
constructor. Error handling like this should be done in parallel to the type for valid log messages. At a minimum you might have:Either String LogMessage
or something. This causes problems later in the exercises when you have to ignoreUnknown
.