Haskell 哈斯克尔DB插入式can';你不能返回我想要的类型吗?
我正试图使用我的Haskell 哈斯克尔DB插入式can';你不能返回我想要的类型吗?,haskell,rethinkdb,Haskell,Rethinkdb,我正试图使用我的saveUser函数将User插入数据库 {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE DeriveGeneric #-} module User where import Database.RethinkDB import Data.Text (Text) import Data.Aeson (FromJSON, ToJSON) import GHC.Generics import Database.RethinkDB sa
saveUser
函数将User
插入数据库
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE DeriveGeneric #-}
module User where
import Database.RethinkDB
import Data.Text (Text)
import Data.Aeson (FromJSON, ToJSON)
import GHC.Generics
import Database.RethinkDB
saveUser :: RethinkDBHandle -> User -> IO User
saveUser handle user = run handle $ table "test" # insert
["email" := (email user),
"hash" := (hash user),
"institutionId" := (institutionId user)]
getAllUsers :: RethinkDBHandle -> IO [User]
getAllUsers handle = run handle $ table "test"
data User = User {
id :: Maybe String,
email :: String,
hash :: String,
institutionId :: String
} deriving (Show, Generic)
instance ToJSON User
instance FromJSON User
instance ToDatum User
instance FromDatum User
instance Expr User
该函数返回一个IO结果
。通过阅读文档,它看起来像是一个,而我的用户
也是一个数据
,因此我希望能够从这个函数返回IO用户
,就像我在getAllUsers
函数中返回IO[User]
一样。但是,我得到以下错误:
No instance for (Result User) arising from a use of ‘run’
In the expression: run handle
In the expression:
run handle
$ table "test"
# insert
["email" := (email user), "hash" := (hash user),
"institutionId" := (institutionId user)]
In an equation for ‘saveUser’:
saveUser handle user
= run handle
$ table "test"
# insert
["email" := (email user), "hash" := (hash user),
"institutionId" := (institutionId user)]
Failed, modules loaded: none.
当我将
saveUser
函数的类型更改回IO-Datum
时,它会再次工作。当run
返回IO结果时,Haskell如何推断我的函数不能返回IO用户
FromDatum a => Result [a]
FromDatum a => Result (Maybe a)
这就解释了为什么您的getAllUsers
函数可以工作,但是,没有一个
FromDatum a => Result a
相反,该API的作者似乎更希望您使用该实例
FromDatum a => Result [a]
FromDatum a => Result (Maybe a)
这样,您就可以在错误插入用户时正确处理故障。如果您将函数更改为
saveUser :: RethinkDBHandle -> User -> IO (Maybe User)
saveUser handle user = run handle $ table "test" # insert
["email" := (email user),
"hash" := (hash user),
"institutionId" := (institutionId user)]
那么它应该编译得很好。(我尝试安装RejectionDB,但显然我的网络版本与之冲突)结果
是一个类<代码>基准
是该类的一个实例。我不熟悉这个库,但我假设您需要一个实例结果用户
。正确。另请参阅运行的文档: