Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 在快照中使用具有持久数据类型的类型安全路由_Haskell_Persistent_Haskell Snap Framework - Fatal编程技术网

Haskell 在快照中使用具有持久数据类型的类型安全路由

Haskell 在快照中使用具有持久数据类型的类型安全路由,haskell,persistent,haskell-snap-framework,Haskell,Persistent,Haskell Snap Framework,我有一个使用Persistent进行存储的Snap应用程序,我正在尝试为Persistent中定义的数据类型生成类型安全路由。我正在使用: 我有以下模板Haskell函数,用于创建Group和GroupId的数据类型: share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase| Group name T.Text deriving Show |] 在我的应用程序.hs中,我有: data

我有一个使用Persistent进行存储的Snap应用程序,我正在尝试为Persistent中定义的数据类型生成类型安全路由。我正在使用:

我有以下模板Haskell函数,用于创建
Group
GroupId
的数据类型:

share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
  Group
    name T.Text
    deriving Show
|]
在我的
应用程序.hs中,我有:

data AppUrl = AddLink GroupId deriving (Eq, Show, Read, Generic)
医生建议:

instance PathInfo AppUrl
如果上面给出了
泛型
派生,那么我需要做的就是

No instance for (PathInfo (KeyBackend SqlBackend Group))
      arising from a use of ‘Web.Routes.PathInfo.$gdmtoPathSegments’
我的假设是,这个错误表明Haskell不知道如何使用Persistent的数据类型自动创建实例定义

我的下一次尝试是手动定义实例:

instance PathInfo AppUrl where
  toPathSegments   (AddLink groupId) = "add-link" : toPathPiece groupId : []
  fromPathSegments (x:y:[]) = ????
我似乎不知道如何构造
GroupId
数据类型

从Yesod的优秀案例中,我知道数据类型的定义如下:

type GroupId = Key Group
newtype Key Group = GroupKey (BackendKey SqlBackend)
但是我遇到了一个问题,因为
BackendKey
没有公开,所以我无法导入它并创建自己的实例。我似乎找不到一个公共API来在Persistent中创建此数据类型。

显示关联的数据类型
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

该数据类型对类是私有的,没有公开,因此我不能实际导入它。@jvans:不,你为什么会这样认为?我在我的答案中添加了一个小例子。啊,不知道我为什么会这样想。一定是误读了错误信息。谢谢你的帮助!