2012-09-06 74 views

回答

19

它看起來像你混淆了類型和構造函數的概念,這是一個常見的問題,因爲它們存在於不同的名稱空間中,並且經常被賦予相同的名稱。在Haskell中表達

data SomeType = SomeType Int 

說,你實際上是在定義類型SomeType構造SomeType。類型不是一般意義上的函數,而是構造函數。如果你問ghci中的SOMETYPE的類型,你會得到這樣的:現在

:t SomeType 
SomeType :: Int -> SomeType 

,一個type聲明僅僅是一個較長的類型定義的簡寫,你的情況做StackIntStack' 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) 
16

構造函數的名稱是Stack',而不是StackInt。使用type創建類型別名不會爲構造函數創建別名(因爲可能有許多類型的構造函數,並且它們的名稱根本不必與類型名稱相關,所以這樣做沒有意義)。

2

沒有數據構造函數叫做StackintStackint由您的type聲明定義爲類型的構造函數。

的數據構造是,爲Stack'Stack',雖然得益於類型同義詞,它會具有類型Int -> Stack' Int而不是a -> Stack' a

相關問題