Haskell, MongoDB, eval JavaScript

Haskell, MongoDB, eval JavaScript

本文关键字:JavaScript eval MongoDB Haskell      更新时间:2023-09-26

我在MongoDB的Haskell驱动程序中使用eval方法编写了一个方法来执行JavaScript代码。

toolsDB_GenerateID :: Action IO Value
toolsDB_GenerateID = 
        eval (Javascript ([] :: [Field]) "var ret_id = db.counters.findAndModify({query: { _id: ''my_id'' },update: { $inc: { seq: 1 } },new: true}); return {id:ret_id.seq};")::Action IO Value

它! !

我在下面使用它:

inserData :: Action IO () 
inserData = do resultEval <-toolsDB_GenerateID 
               insert "test" ["id" =: resultEval]
               liftIO $ return ()

我只是不明白我怎么能从Action IO Value得到一个真实的值?

像这样:

Action IO Value -> Value 

Action IO Value -> Int

我如何释放它?

你不能做你要求的,但很可能你不需要做。您可以执行以下操作,而不是

foo :: Action IO SomeOtherType
foo = do value <- action -- where action :: Action IO SomeType
      -- here value :: SomeType can be used normally
      ...
      lastAction

,唯一的限制是lastAction类型为Action IO SomeOtherType

经验法则是,你不能永远从monad中提取一个值,但你可以"暂时"提取它,只要你最终在同一个monad中产生另一个值。从纯粹实用的角度来看,这就是单子的意义所在。

我建议你读一些monad教程。图片中的单子是最简单的,也是我最喜欢的。