Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.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 哈斯克尔DB插入式can';你不能返回我想要的类型吗?_Haskell_Rethinkdb - Fatal编程技术网

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,但显然我的
网络版本与之冲突)

结果
是一个类<代码>基准
是该类的一个实例。我不熟悉这个库,但我假设您需要一个
实例结果用户
。正确。另请参阅
运行的文档: