Haskell模糊类型变量 - 我迷路了?

时间:2011-11-03 21:45:22

标签: haskell mongodb

所以,我的想法是,我将使用以下用于在haskell中运行MongoDB查询的代码

我想把它变成这个,这样我就可以假装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 - 如何使其明确无误?制作这种抽象是不是一个坏主意?你会怎么做?

1 个答案:

答案 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))