2
只是關於打字的快速問題。Haskell鍵入爲詮釋和雙的
如果我輸入到ghci中:t [("a",3)]
我回來[("a",3)] :: Num t => [([Char], t)]
中的文件,因爲我已經定義了一個類型:
type list = [(String, Int)]
我怎樣才能改變類型與支持Int
S和Double
小號我定義的類型與我在ghci中寫的類似?
只是關於打字的快速問題。Haskell鍵入爲詮釋和雙的
如果我輸入到ghci中:t [("a",3)]
我回來[("a",3)] :: Num t => [([Char], t)]
中的文件,因爲我已經定義了一個類型:
type list = [(String, Int)]
我怎樣才能改變類型與支持Int
S和Double
小號我定義的類型與我在ghci中寫的類似?
首先,您的代碼有錯誤。數據類型必須以大寫字母開始:
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程序員通常遵循規則「不要在數據聲明中包含類型約束」。
謝謝,就是我在找的東西。我會在幾分鐘內接受答案。 – user1453477
請注意,'DataTypeContexts'在Haskell2010中消失了。你仍然可以使用GHC擴展名,但是爲什麼會這樣呢,他們從來沒有用過。 –
最後一件事,我有一個函數,檢查列表中是否有兩個數字相等,使用contrament Num a =>給我一個錯誤,它不能通過使用'=='來推斷(Eq a)。 爲了解決這個問題,我將約束條件改爲了等式a => ...這是最好的方法,因爲我需要將Eq a =>約束添加到我的很多函數中。 – user1453477