2010-01-11 63 views
4

我創建了一個數據類型來保存基本用戶信息並將其加載到ghci中。然後我使用ghci來查看新的數據類型類型簽名。我從ghci中將類型簽名複製到源文件中,並嘗試重新加載文件。 Ghci拋出一個錯誤。使用推斷類型的Haskell類型錯誤

代碼和錯誤如下。

我的問題是,爲什麼這會拋出一個錯誤。我使用由ghci推斷的類型。

User :: Int -> String -> String -> String -> String -> User 
data User = User { userID :: Int, 
        login :: String, 
        password :: String, 
        username :: String, 
        email :: String 
        } deriving (Show) 

前奏>,R用戶[1 1]編譯 用戶(User.hs, 解釋)

User.hs:3:0:無效類型簽名 失敗,模塊加載: 沒有。

回答

14

您可以聲明一個值的類型(例如函數),但是您不可以使用值的類型聲明語法來聲明數據類型或數據構造函數的類型。實際上,當你定義它們時,你已經聲明瞭數據類型和數據構造函數的完整類型,所以不需要額外的類型聲明。所以只需要刪除User :: ...;該行是語法錯誤,因爲它具有大寫U(構造函數)User,並且只有小寫名稱(值)可能歸屬類型。

5

順便說一句,如果你想在「類型annotationy」 Y的風格來寫用戶,你可以用GADT語法這樣做:

{-# LANGUAGE GADTs #-} 

data User where 
    User :: Int -> String -> String -> String -> String -> User 
+0

感謝其他信息;這是一個很好的提示。 – BlueBadger 2010-01-17 06:12:12