2015-08-08 33 views
2

我有一個使用Persistent進行存儲的Snap應用程序,我試圖爲Persistent中定義的數據類型生成類型安全路由。我正在使用snap-web-routes package:。在管理單元中使用帶有持久數據類型的類型安全路由

我有一個創建的GroupGroupId數據類型下面模板哈斯克爾功能:

share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase| 
    Group 
    name T.Text 
    deriving Show 
|] 

在我Application.hs我:

data AppUrl = AddLink GroupId deriving (Eq, Show, Read, Generic) 

一下文件的建議:

instance PathInfo AppUrl 

是我所需要做的給予Generic推導上述然而,這打擊了

No instance for (PathInfo (KeyBackend SqlBackend Group)) 
     arising from a use of ‘Web.Routes.PathInfo.$gdmtoPathSegments’ 

我的假設是,這個錯誤表示哈斯克爾不知道如何自動創建具有持續性的數據類型的實例定義。

我的下一個嘗試是手動定義實例:

instance PathInfo AppUrl where 
    toPathSegments (AddLink groupId) = "add-link" : toPathPiece groupId : [] 
    fromPathSegments (x:y:[]) = ???? 

我似乎無法弄清楚如何構建GroupId數據類型。

從耶索德的優秀Persistent tutorial我知道數據類型被定義爲:

type GroupId = Key Group 
newtype Key Group = GroupKey (BackendKey SqlBackend) 

但後來我遇到一個問題,因爲BackendKey不外露,所以我不能將其導入並創建自己的實例。我似乎無法找到一個公共的API來在Persistent中創建這種數據類型。

回答

1

表明,相關的數據類型BackendKey被實例化的SqlBackend作爲

data BackendKey SqlBackend = SqlBackendKey { 
    unSqlBackendKey :: Int64 
} 

這應該是足夠的信息來編寫自己的PathInfo例如,沿着下面的示例中的行:

{-# LANGUAGE TypeFamilies #-} 

import Database.Persist.Sql 
import Data.Int (Int64) 

foo :: BackendKey SqlBackend -> Int64 
foo (SqlBackendKey key) = key 

bar :: Int64 -> BackendKey SqlBackend 
bar = SqlBackendKey 
+0

的數據類型對於類是私有的而不是公開的,所以我不能實際導入它。 – jvans

+0

@jvans:不,你爲什麼這麼想?我在我的答案中添加了一個小例子。 – Cactus

+0

啊不知道爲什麼我這麼認爲。必須誤讀錯誤消息。謝謝你的幫助! – jvans