Какие классы типов должны быть определены для пути 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-адреса?

Ответы на вопрос(2)

Ваш ответ на вопрос