Непосредственной реализацией вашего вопроса может быть:
parseEventType :: [String] -> EventType
parseEventType ["EVENT", _, _, "RUN_EVENT", i] = RUN_EVENT (read i)
parseEventType ["EVENT", i, _, "GIVE_ITEM", j] = GIVE_ITEM (read i) (read j)
parseEventType x = error ("parseEventType: could not parse " ++ show x)
Случай GIVE_ITEM может быть неправильным, но он должен дать вам представление.
Однако, это имеет некоторые проблемы, в основномвокруг обработки ошибок: что вы делаете, если аргументы не являются целыми числами или если форма списка не соответствует ни одному из ваших типов?Было бы проще использовать Maybe
:
parseEventType :: [String] -> Maybe EventType
parseEventType ["EVENT", _, _, "RUN_EVENT", i] = RUN_EVENT <$> readMay i
parseEventType ["EVENT", i, _, "GIVE_ITEM", j] = GIVE_ITEM <$> readMay i <*> readMay j
parseEventType x = Nothing
Это демонстрирует аппликативный стиль.