2012-06-13 41 views
2

只是關於打字的快速問題。Haskell鍵入爲詮釋和雙的

如果我輸入到ghci中:t [("a",3)]我回來[("a",3)] :: Num t => [([Char], t)]

中的文件,因爲我已經定義了一個類型:

type list = [(String, Int)] 

我怎樣才能改變類型與支持Int S和Double小號我定義的類型與我在ghci中寫的類似?

回答

4

首先,您的代碼有錯誤。數據類型必須以大寫字母開始:

type List = [(String, Int)] 

(注:String[Char]一種代名詞,即它們是完全一樣的類型)。我們將以迂迴的方式解決您的問題。請注意,您可以讓完全類型一般的元組的第二個插槽:

type List a = [(String,a)] 

讓你的類型參數化在任意類型。如果您需要在某些功能中專注於數字類型,則可以分別爲每個功能進行專門化。例如:

foo :: Num a => List a 
foo = [("Hello",1),("World",2)] 

我們也可以包含在數據類型的約束,像這樣:

data Num a => List a = List [(String,a)] 

,但你仍然要包括在每一個函數聲明的約束Num a => ...,所以你不」實際上保存任何打字。出於這個原因,Haskell程序員通常遵循規則「不要在數據聲明中包含類型約束」。

+0

謝謝,就是我在找的東西。我會在幾分鐘內接受答案。 – user1453477

+2

請注意,'DataTypeContexts'在Haskell2010中消失了。你仍然可以使用GHC擴展名,但是爲什麼會這樣呢,他們從來沒有用過。 –

+0

最後一件事,我有一個函數,檢查列表中是否有兩個數字相等,使用contrament Num a =>給我一個錯誤,它不能通過使用'=='來推斷(Eq a)。 爲了解決這個問題,我將約束條件改爲了等式a => ...這是最好的方法,因爲我需要將Eq a =>約束添加到我的很多函數中。 – user1453477