当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《Haskell模糊类型变量-我迷路了?》经验,为你挑选了1个好方法。

所以,我的想法是,我将使用以下代码在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 - 我怎样才能使它明确无误?制作这种抽象是不是一个坏主意?你会怎么做?



1> Thomas M. Du..:

我总是想回答这些问题"这是因为你的类型含糊不清".例如,如果给你一个值:

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

推荐阅读
小白也坚强_177
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有