讓我們假設我有一個類型的類Stack
用一個實例List
:類型類中的多個類型參數?
class Stack a where
push :: a -> Integer -> a
pop :: a -> a
last :: a -> Integer
data List = Empty | Element Integer List
instance Stack List where
push list value = Element value list
pop Empty = error "No elements"
pop (Element _ list) = list
last Empty = error "No elements"
last (Element value _) = value
如何Stack
已經在順序定義爲List
不侷限於Integer
值?
-- class Stack (?) where ...
data List a = Empty | Element a (List a)
-- instance Show (List a) where ...
在此之前,我實際上嘗試過相同的語法,但只寫了'實例堆棧(List a)'。我忘了將'FlexibleInstances'附加到編譯指示中。現在它可以工作,謝謝:) – Cubinator73
如果每個'a'最多隻允許一個'b',這樣'Stack a b'就有一個實例,函數依賴'a-> b'可以顯着幫助類型推理機器。否則,每次調用'pop :: a - > a'都是不明確的:'b'不能從'pop'的上下文中確定。 (當然也可以使用類型族。) – chi
@chi:IIRC你可以添加限制,例如'a'只有一個這樣的'b'。稍後再看。 –