簡體   English   中英

了解Haskell Postgresql連接函數類型錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM