請告訴我什麼是問題?不在範圍內:Haskell中的數據構造函數
data Stack' v = Stack' [v] Int deriving (Show) ... type StackInt = Stack' Int main = print(StackInt [1,2,3] 4)
我得到的錯誤是
Not in scope: data constructor `Stackint'
有什麼不對?
請告訴我什麼是問題?不在範圍內:Haskell中的數據構造函數
data Stack' v = Stack' [v] Int deriving (Show) ... type StackInt = Stack' Int main = print(StackInt [1,2,3] 4)
我得到的錯誤是
Not in scope: data constructor `Stackint'
有什麼不對?
它看起來像你混淆了類型和構造函數的概念,這是一個常見的問題,因爲它們存在於不同的名稱空間中,並且經常被賦予相同的名稱。在Haskell中表達
data SomeType = SomeType Int
說,你實際上是在定義類型SomeType
和構造SomeType
。類型不是一般意義上的函數,而是構造函數。如果你問ghci中的SOMETYPE的類型,你會得到這樣的:現在
:t SomeType
SomeType :: Int -> SomeType
,一個type
聲明僅僅是一個較長的類型定義的簡寫,你的情況做StackInt
的Stack' Int
的代名詞。但爲了構造這種類型的值,您仍然需要使用構造函數Stack'
(其類型爲[v] -> Int -> Stack' v
)。所以,你的代碼應該是
data Stack' v = Stack' [v] Int deriving (Show)
main = print(Stack' [1,2,3] 4)
如果你想確保類型是Stack' Int
,那麼你可以添加一個功能
data Stack' v = Stack' [v] Int deriving (Show)
stackInt :: [Int] -> Int -> Stack' Int
stackInt list i = Stack' list i
main = print(stackInt [1,2,3] 4)
編輯:還沒有,我已經寫了stackInt list i = Stack' list i
透明度在這裏,但你可以寫得更優雅,就像stackInt = Stack'
一樣。這是類型約束,確保您在這裏獲得正確的類型。
你還可以兼得的新功能和類型的代名詞,如果你想要的,即
data Stack' v = Stack' [v] Int deriving (Show)
type StackInt = Stack' Int
stackInt :: [Int] -> Int -> StackInt
stackInt list i = Stack' list i
main = print(stackInt [1,2,3] 4)
構造函數的名稱是Stack'
,而不是StackInt
。使用type
創建類型別名不會爲構造函數創建別名(因爲可能有許多類型的構造函數,並且它們的名稱根本不必與類型名稱相關,所以這樣做沒有意義)。
沒有數據構造函數叫做Stackint
。 Stackint
由您的type
聲明定義爲類型的構造函數。
的數據構造是,爲Stack'
,Stack'
,雖然得益於類型同義詞,它會具有類型Int -> Stack' Int
而不是a -> Stack' a
。