好吧,讓我們跳過至年底,併火起來ghci的。 [(1,2,3),(1,2)]
有什麼類型?
ghci> :t [(1,2,3),(1,2)]
<interactive>:1:10:
Couldn't match expected type `(t0, t1, t2)'
with actual type `(t3, t4)'
In the expression: (1, 2)
In the expression: [(1, 2, 3), (1, 2)]
In an equation for `it': it = [(1, 2, 3), (1, 2)]
該錯誤是不是因爲我輸入的數據錯誤,這是因爲[(1,2,3),(1,2)]
是無效的Haskell。
在Haskell名單可以容納物品的數量不受限制,需要提醒的是所有項目必須是同一類型的。
看起來很奇怪,但是(1,2,3)
和(1,2)
不是同一類型。一個是三元組,一個是二元組。
元組是一個列表排序,相反的 - 它只能容納物品的具體數量,但他們可以是一堆不同類型的。元組類型由它們包含的項目給出的類型序列來定義。
所以3點的整數(或如GHC將顯示,像數的東西)的元組是不同的類型的2個整數的元組。我們可以看到,這個直接用:t
運營商在ghci的:
ghci> :t (1,2,3)
(1,2,3) :: (Num t1, Num t2, Num t) => (t, t1, t2)
ghci> :t (1,2)
(1,2) :: (Num t1, Num t) => (t, t1)
請參閱(2,3,4)
和(2,3)
有匹配(1,2,3)
和(1,2)
的分別是類型:
ghci> :t (2,3,4)
(2,3,4) :: (Num t1, Num t2, Num t) => (t, t1, t2)
ghci> :t (2,3)
(2,3) :: (Num t1, Num t) => (t, t1)
這是因爲(2,3,4)
和(1,2,3)
兩個值具有相同的類型。 (1,2)
和(2,3)
也是如此。
因此,沒有函數在haskell中將[[1,2,3],[1,2]]
轉換爲[(1,2,3),(1,2)]
,因爲這樣的函數的結果不可能進行類型檢查。
很確定你需要依賴類型來實現這樣的功能...... – 2011-05-02 18:32:03
相關類型不是必需的。這只是一個普通的舊代數數據類型問題。 – 2011-05-02 18:34:13
@唐嗯,誤解了這個問題。問題是他想要一個異類列表。 – 2011-05-02 18:37:37