代碼的這個特定部分的目的是使size
函數比簡單計算elems
中的所有元素更有效。我已經解決了總結構成列表的兩種類型,但我似乎無法創建大小函數的簽名。如何匹配類型「任一b」?
instance (Finite a, Finite b) => Finite (Either a b) where
elems = combineLists [Left x | x <- elems] [Right x | x <-elems]
size ??? = (size a) + (size b)
從前奏,我們知道Either a b = Left a | Right b
。
我嘗試的第一件事是匹配Either
,但它當然是一種類型,所以這是行不通的。接下來,我試過((Left a) | (Right b))
,但是沒有繼續。沒有其他東西似乎與Either a b
類型匹配。
我能得到size (Left a)
編譯,但由於它缺少b
成分,我收到錯誤:
Ambiguous type variable `b' in the constraint:
`Finite b' arising from a use of `size' at <interactive>:1:0-12
這當然是有道理的背景下,但我真的不知道如何匹配Either a b
。
有人有什麼想法嗎?
您似乎對類型和構造函數之間的區別有點困惑。 「一個b」是一個帶有兩個構造函數的類型,「左」和「右」。類型進入類型簽名,而構造函數進入代碼。這是一個常見的混淆,因爲很多類型使用相同的名稱作爲類型和構造函數,如「data Foo = Foo Int String」;第一個「Foo」是類型,而第二個是構造函數。 – 2010-02-25 20:17:03