Welche Typklassen müssen für einen Yesod-Pfad definiert werden?

In meiner Anwendung gibt es in meinem Datenmodell mehrere verschiedene Fälle, in denen eine Ganzzahl oder eine Zeichenfolge für einen Bezeichner verwendet wird. Aus Sicherheitsgründen habe ich diese Bezeichner in neue Typdeklarationen eingeschlossen:

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

Wenn ich meine Yesod-Pfade einrichte, stelle ich fest, dass ich mindestens drei Instanzen für jede dieser Instanzen erstellen muss und die Instanzen fast immer identisch sind

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

Dieser Text, immer und immer wieder.

Was muss ich wirklich einrichten, um meinen Datentyp in URLs (wie @ {ViewDocument docId}) zu rendern und diese URLs analysieren zu können?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage