[英]Understanding Haskell postgresql connection function type error
我現在是Java程序員,正在閱讀和學習haskell。 我正在嘗試編寫一個簡單的程序,以使用HDBC postgres驅動程序連接(和斷開連接)到postgres數據庫。 為了簡單起見,我沒有任何其他邏輯。
它拋出一個函數類型錯誤。 我將代碼縮進正確,如果刪除斷開連接,則它可以使用定義的類型。
有人可以闡明我為該函數定義的類型所缺少的嗎? 我會很感謝你的幫助。
謝謝!
樣例代碼:
import Database.HDBC
import Database.HDBC.PostgreSQL
import Database.HaskellDB
import Database.HaskellDB.HDBC.PostgreSQL
tryConnect :: Int -> (Database -> IO Connection) -> ()
tryConnect id =
do
c <- postgresqlConnect [("host","dbhost"),("dbname","db1"),("user","user1"),("password","test")]
disconnect c
return ()
我從GHCi得到以下錯誤
Couldn't match expected type `(Database -> IO Connection) -> a'
against inferred type `IO ()'
In a stmt of a 'do' expression: disconnect c
In the expression:
do { c <- postgresqlConnect
[("host", "dbhost"), ("dbname", "db1"), ....];
disconnect c;
return () }
In the definition of `insrt':
insrt id
= do { c <- postgresqlConnect [("host", "dbhost"), ....];
disconnect c;
return () }
失敗,模塊已加載:無。
問題是您沒有為postgresqlConnect
提供足夠的參數。 它的類型簽名是[(String, String)] -> (Database -> ma) -> ma
,但是您僅提供了第一個參數。 給postgresqlConnect
提供第二個參數應該可以解決該問題,並且您可以將類型聲明改回Int -> IO ()
。
編輯:下面的答案是完全錯誤的。 我的錯。
好吧,類型簽名是
tryConnect :: Int -> (Database -> IO Connection) -> ()
。
通常,這將表明該函數接受一個
Int
和一個
(Database -> IO Connection)
並返回
()
,但是您在函數定義中提供的唯一參數是
id
。
因此,實際上,您有一個采用
Int
並返回具有類型簽名
(Database -> IO Connection) -> ()
的新函數的函數。
可以,除非函數的主體與此簽名不匹配。
do
表達式返回的是
IO ()
值,而不是預期的函數,因此會出現錯誤,因為編譯器獲得的返回值與預期的不同。
因此,總而言之,似乎在類型簽名中有一個參數尚未在實際函數中使用。
從類型簽名中刪除該函數,或者將該函數更改為
tryConnect id func = ...
而不是
tryConnect id = ...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.