所以,我的想法是,我将使用以下用于在haskell中运行MongoDB查询的代码
Haskell MongoDB驱动程序简介:https://github.com/TonyGen/mongoDB-haskell/blob/master/doc/Example.hs
pipe< - runIOE $ connect $ host“127.0.0.1” 让run action =访问管道主“testdb”动作 运行$ 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 - 如何使其明确无误?制作这种抽象是不是一个坏主意?你会怎么做?
答案 0 :(得分:6)
我总是想回答这些问题“这是因为你的类型含糊不清”。例如,如果给您一个值:
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))