| Warning
| Error Int
deriving (Show, Eq)
type TimeStamp = Int
data LogMessage
= LogMessage
MessageType
TimeStamp
String
| Unknown String
deriving (Show, Eq)
parseMessage :: String -> LogMessage
parseMessage line = if isNothing msgType || isNothing timeStamp || isNothing msg then Unknown line else LogMessage (fromJust msgType) (fromJust timeStamp) (fromJust msg)
where
arr = splitOneOf " " line
msgType :: Maybe MessageType
| head arr == "I" = Just Info
| head arr == "W" = Just Warning
| head arr == "E" = Just $ Error (read $ arr !! 1 :: Int)
| otherwise = Nothing
timeStamp :: Maybe TimeStamp = readMaybe $ arr !! (if head arr == "E" then 2 else 1) :: Maybe Int
msg :: Maybe String = if isNothing msgType || isNothing timeStamp then Nothing else Just $ unwords (if head arr == "E" then tail $ tail $ tail arr else tail $ tail arr)
Ну странный вопрос, тебе по какой шкале? Что даст тебе цифра?
Качество кода, прошу указать на места, где можно сделать лучше/явно сделано далеко не лучшим образом
Ну так и надо. Так-то на изначальный твой вопрос можно ответить "средне плохо" или "очень плохо", тока толку от этого нет
как по мне это решение очень неидиоматично - сила Хаскелля в том, что можно легко проверить формат данных и скомбинировать их в нужный результат, а тут используется более императивный подход, аля "возьми элемент номер 1, это код ошибки"
parseMessage :: String -> LogMessage parseMessage line = case parse1 $ splitOneOf " " line of (Just a) -> a _ -> Unknown line where parse1 ("I":xs) = parse2 Info xs parse1 ("W":xs) = parse2 Warning xs parse1 ("E":(x:xs)) = case readMaybe $ x :: Maybe Int of (Just a) -> parse2 (Error $ a) xs _ -> Nothing parse1 (_:xs) = Nothing parse2 msgType (x:xs) = case readMaybe x of (Just a) -> Just $ LogMessage msgType a (unwords xs) _ -> Nothing parse2 _ [] = Nothing Я работаю в правильном направлении?
да, имена бы ещё дать осмысленные
Обычно вместо небазовой splitOneOf " " используют обычную words из Prelude. Но она разделяет строку не только по пробелам, а по любым пробельным символам, так что это не совсем одно и то же.
скобки вокрук всего паттерна лишние (Just a) -> _ Just a -> _
конс правоассоциативен parse1 ("E":(x:xs)) = _ parse1 ("E" : x : xs) = _
доллар с одной переменной не нужен readMaybe $ x readMaybe x (Error $ a) (Error a)
Обсуждают сегодня