2013-12-23 99 views
2

在我的應用程序中,我的數據模型有幾個不同的使用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,我真的需要設置什麼?

回答

4

如果您打開GeneralizedNewtypeDeriving,則只需在每個新數據類型下添加deriving PathPiece,如果無法直接導出數據類型,則可以添加deriving instance PathPiece DocId

對於要成爲路由一部分的每個數據類型,您都需要Read,Show和PathPiece實例。

+0

其實,我不能那樣做,因爲我在應用程序中進行了嚴格的分離。我聲明大部分數據類型的地方都在一個根本不知道Yesod的庫中。 –

+0

您可以等效使用獨立派生:派生實例PathPiece DocId。但是,您確實無法在類型的聲明站點導入「Web.PathPieces」?我個人更喜歡這樣做來創建孤立實例。 –

+0

孤兒實例實際上開始令我非常惱火。但是我的核心庫代表了應用程序的「無頭」實現,甚至沒有依賴任何web工具。我部署的應用程序導入了我的核心庫和Yesod。不過,獨立派生很有效。我不知道這是可以做到的。有點像我不知道如何定義可以派生的數據類型。 –

0

基於一些試驗和錯誤(即刪除功能和看到的休息時間),它看起來像,以便數據類型是一個耶索德路徑的一部分,它需要被定義了三種類型類:

  • 顯示上述
  • PathPiece

我ToMarkup聲明適用於我如何在HTML(哈姆雷特,火焰,什麼,但對我來說哈姆雷特)顯示我的數據類型。因此,如果我只將數據類型放入URL中,則不是必需的。

相關問題