Jakie typy muszą być zdefiniowane dla ścieżki Yesod?

W mojej aplikacji mój model danych ma kilka różnych instancji użycia liczby całkowitej lub ciągu znaków dla niektórych identyfikatorów. Ze względów bezpieczeństwa poszedłem dalej i zapakowałem te identyfikatory w nowe deklaracje typu:

newtype DocId = DocId Integer
newtype GroupName = GroupName String
newtype UserName = UserName String

Kiedy konfiguruję moje ścieżki Yesod, odkrywam, że muszę utworzyć co najmniej trzy instancje dla każdego z nich, a instancje są prawie zawsze identyczne

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

Ten tekst w kółko.

Co naprawdę muszę skonfigurować, aby zarówno wyświetlać mój typ danych w adresach URL (np. @ {ViewDocument docId}), jak i móc analizować te adresy?

questionAnswers(2)

yourAnswerToTheQuestion