2011-11-03 43 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