所以,我的想法是,我将使用以下代码在haskell中运行MongoDB查询
完整示例:https://gist.github.com/1337864
Haskell MongoDB驱动程序简介:https://github.com/TonyGen/mongoDB-haskell/blob/master/doc/Example.hs
pipe < - runIOE $ connect $ host"127.0.0.1"let run action = access pipe master"testdb"action run $ delete $ select []"mycollection"
我想把它变成这个,这样我就可以假装run函数是一个"db",就像普通的mongo驱动程序一样.
db <- connectDb "127.0.0.1" "testdb" db $ delete $ select [] "mycollection"
这是我写的功能:
mdb :: (MonadIO m) => String -> String -> IO (Action m a -> m (Either Failure a)) mdb hostname dbname = do pipe <- runIOE $ connect $ host hostname return (access pipe master (pack dbname))
我把这种类型保留为无类型,然后询问ghci类型是什么.我几乎听不懂.
所以这就是问题所在
当我让我的程序只有db <- connectDb "127.0.0.1" "testdb"
并且不使用它时,它会因为这个不明确的类型错误而失败:https: //gist.github.com/1337864 - 我怎样才能使它明确无误?制作这种抽象是不是一个坏主意?你会怎么做?
我总是想回答这些问题"这是因为你的类型含糊不清".例如,如果给你一个值:
MonadIO m => (Action m a -> m (Either Failure a))
并告诉monad m
是一个特定的 monad(不只是任何一个),你能告诉它是哪一个吗?没有.
如果您不在上下文中使用返回的值,使Monad m
属于哪个上下文,那么您需要为编译器提供其他信息:
db <- connectDB "127.0.0.1" "testdb" :: IO (Action IO a -> IO (Either Failure a))