У меня есть тип данных
data Time = Time {hour :: Int,
minute :: Int
}
для которого я определил экземпляр Show как
instance Show Time where
show (Time hour minute) = (if hour > 10
then (show hour)
else ("0" ++ show hour))
++ ":" ++
(if minute > 10
then (show minute)
else ("0" ++ show minute))
который печатает время в формате 07:09
.
Теперь должна быть симметрия между Show
и Read
, поэтому после чтения (но не по-настоящему (я думаю) понимания) this и this и прочитав документацию, я придумал следующий код:
instance Read Time where
readsPrec _ input =
let hourPart = takeWhile (/= ':')
minutePart = tail . dropWhile (/= ':')
in (\str -> [(newTime
(read (hourPart str) :: Int)
(read (minutePart str) :: Int), "")]) input
Это работает, но часть ""
делает это неправильным. Итак, мой вопрос заканчивается:
Может ли кто-нибудь объяснить мне правильный способ реализовать Read для синтаксического анализа "07:09"
в newTime 7 9
и/или показать мне?