Какие классы типов должны быть определены для пути Yesod?
В моем приложении моя модель данных имеет несколько разных случаев использования Integer или String для некоторого идентификатора. В целях безопасности я пошел дальше и обернул эти идентификаторы в объявления новых типов следующим образом:
newtype DocId = DocId Integer
newtype GroupName = GroupName String
newtype UserName = UserName String
Когда я настраиваю свои пути Yesod, я обнаруживаю, что мне нужно создать как минимум три экземпляра для каждого из них, и экземпляры почти всегда идентичны
instance Read DocId where
readsPrec prec val = case reads val of
(i, ""):_ -> [(DocId i, "")]
[] -> []
instance B.ToMarkup DocId where
toMarkup (DocId val) = B.toMarkup val
instance PathPiece DocId where
toPathPiece (DocId i) = T.pack $ show i
fromPathPiece s =
case reads $ T.unpack s of
(i, ""):_ -> Just i
[] -> Nothing
Этот текст снова и снова.
Что мне действительно нужно настроить для того, чтобы отображать мой тип данных в URL-адресах (например, @ {ViewDocument docId}) и анализировать эти URL-адреса?