Я нахожу, что rex тоже неплохо, его интеграция с ViewPatterns - хорошая идея, я думаю.
Хотя это может быть многословно, но это частично связано с концепцией регулярных выражений.
parseDate :: String -> LocalTime
parseDate [rex|(?{read -> year}\d+)-(?{read -> month}\d+)-
(?{read -> day}\d+)\s(?{read -> hour}\d+):(?{read -> mins}\d+):
(?{read -> sec}\d+)|] =
LocalTime (fromGregorian year month day) (TimeOfDay hour mins sec)
parseDate v@_ = error $ "invalid date " ++ v
Тем не менее, я только что обнаружил аппликативное выражение, упомянутое в одном из других ответов, и это может быть лучшим выбором, может быть менее многословным и более идиоматическим, хотя у rex практически нулевая кривая обучения, если вы знаете регулярные выражения, которые могут быть плюс.