2011-11-03 46 views
2

所以,这个想法是,我想借此用来在Haskell执行MongoDB查询Haskell模糊类型变量 - 我迷路了?

我想把它变成这个,这样我可以假装运行函数是一个“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 - 我怎样才能使它明确?做这种抽象是不是一个好主意?你会怎么做?

回答

6

我总是觉得回答这些问题“这是因为你的类型不明确”。例如,如果给你一个值:

MonadIO m => (Action m a -> m (Either Failure a)) 

,并告诉单子m特定单子(不是任何一个),你可以告诉它是哪一个?

号如果不使用上下文,使得它显然这单子m属于,那么你需要给编译器的其他信息返回值:

db <- connectDB "127.0.0.1" "testdb" :: IO (Action IO a -> IO (Either Failure a)) 
+0

谢谢!另外请注意,更改mdb的签名也可以。我没有意识到我在说那种类型的话。 –

+0

如果'MonadIO m => m'会在其他不明确的情况下默认为'IO',那将会很不错。 –

+0

@丹伯顿:这里有'-fextended-default-rules'和一个对应的编译指示。检查是否有'MonadIO'的默认值。我认为这种违约是邪恶的 - 这就是为什么它默认关闭。一个有趣的例子是'Control.Applicative'到'IO'的默认值。 – nponeccop