在我的應用程序中,我的數據模型有幾個不同的使用Integer或String作爲標識符的實例。爲了安全起見,我已經先行一步,幷包裹這些標識符爲NEWTYPE聲明如下所示:需要爲Yesod路徑定義什麼類型的類?
newtype DocId = DocId Integer
newtype GroupName = GroupName String
newtype UserName = UserName String
當我建立我的耶索德路徑,我發現,我要爲每一個至少三個實例這些實例幾乎總是相同的
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,我真的需要設置什麼?
其實,我不能那樣做,因爲我在應用程序中進行了嚴格的分離。我聲明大部分數據類型的地方都在一個根本不知道Yesod的庫中。 –
您可以等效使用獨立派生:派生實例PathPiece DocId。但是,您確實無法在類型的聲明站點導入「Web.PathPieces」?我個人更喜歡這樣做來創建孤立實例。 –
孤兒實例實際上開始令我非常惱火。但是我的核心庫代表了應用程序的「無頭」實現,甚至沒有依賴任何web工具。我部署的應用程序導入了我的核心庫和Yesod。不過,獨立派生很有效。我不知道這是可以做到的。有點像我不知道如何定義可以派生的數據類型。 –