我对Haskell比较陌生,这是我第一次使用monad transformers。如果能帮上忙我会很感激的。
runQuery :: Pipe -> Query -> ActionM (Either Failure [Document])
runQuery pipe query = access pipe master "nutrition" (find query >>= rest)
main = do
pipe <- runIOE $ connect $ host "127.0.0.1"
scotty 3000 $ do
post "/" $ do
b <- body
let user :: Either String User = eitherDecode b
case user of
Left err -> text . pack $ "Could not decode the user:" ++ err ++ ":\n" ++ (show b)
Right u -> do
let query::Query = (select ["i_name" =: ["$in" =: map (unpack . name) (foods u)]] "stock_foods")
results <- runQuery pipe query
...我正在尝试查询scotty web框架下的mongodb数据库,但是我得到了一个关于MonadBaseControl的错误。我真的需要创建一个这样的实例才能用scotty连接到数据库吗?我该怎么做呢?
No instance for (MonadBaseControl
IO (scotty-0.7.2:Web.Scotty.Types.ActionT Text IO))
arising from a use of `find'
Possible fix:
add an instance declaration for
(MonadBaseControl
IO (scotty-0.7.2:Web.Scotty.Types.ActionT Text IO))发布于 2014-10-13 15:58:05
mongoDB足够通用,可以在作为MonadBaseControl IO和MonadIO实例的任何monad中工作。
例如,您可以选择IO monad。在这种情况下,您需要在scotty的操作中使用liftIO . runQuery:
import Web.Scotty
import Database.MongoDB
import qualified Data.Text.Lazy as T
import Control.Monad.IO.Class
runQuery :: Pipe -> Query -> IO [Document]
runQuery pipe query = access pipe master "nutrition" (find query >>= rest)
main = do
pipe <- connect $ host "127.0.0.1"
scotty 3000 $ do
get "/" $ do
res <- liftIO $ runQuery pipe (select [] "stock_foods")
text $ T.pack $ show res在@Sebastian Philipp added MonadBaseControl Scotty.ActionT实例之后,不需要抬起任何东西。你可以透明地使用mongoDB form scotty。只需更改类型签名并删除liftIO:
runQuery :: Pipe -> Query -> ActionM [Document]
...
get "/" $ do
res <- runQuery pipe (select [] "stock_foods")
text $ T.pack $ show reshttps://stackoverflow.com/questions/23531465
复制相似问题