Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.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
Scotty使用MongoDB_Mongodb_Haskell_Monads_Monad Transformers_Scotty - Fatal编程技术网

Scotty使用MongoDB

Scotty使用MongoDB,mongodb,haskell,monads,monad-transformers,scotty,Mongodb,Haskell,Monads,Monad Transformers,Scotty,我对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

我对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  
            ...
具有足够的通用性,可以在作为
MonadBaseControl IO
MonadIO
实例的任何monad中工作

例如,您可以选择
IO
monad。在这种情况下,您需要
liftIO。在scotty的操作中运行query

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

您应该在问题中包含足够的代码(包括所有导入,以及您从Hackage中使用的包的名称),以便我们可以自己尝试编译它。它使调试和测试不同解决方案变得更容易。我猜你可以在
runQuery
中用一个简单的
lift
来解决这个问题,但不能测试它。我真的很感激。事实证明,我需要提升runQuery函数,并将其返回类型从
ActionM(或者…
更改为
IO(或者…
)。我想我现在可以在monad transformers上取得更大的进步了!如果有帮助的话,我正在经历一些非常相似的事情:将Scotty与Persistent一起使用,并试图找出如何使用transformers。这里有一些代码似乎是有效的:(忘了说:我应该使用
liftIO
而不是多个
lift
s…还有很多事情要做,所以请不要认为我发布的代码是合理的:我只是出于兴趣发布它)。这是一个为ActionT添加MonadBaseControl实例的请求。
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
runQuery :: Pipe -> Query -> ActionM [Document]
...
    get "/" $ do
      res <- runQuery pipe (select [] "stock_foods")
      text $ T.pack $ show res