Załóżmy Mam klasy typu Stack
z jednej instancji List
:Wiele parametrów typu w klasie typów?
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
Jak Stack
musi być zdefiniowany w celu List
nie powinien być ograniczony do Integer
wartości?
-- class Stack (?) where ...
data List a = Empty | Element a (List a)
-- instance Show (List a) where ...
Przedtem faktycznie wypróbowałem tę samą składnię, ale napisałem tylko "Stos stosu (lista a)". I zapomniałem dołączyć "FlexibleInstances" do pragmy. Teraz działa, dziękuję :) – Cubinator73
Jeśli każde 'a' przyznaje co najwyżej pojedyncze' b' takie, że 'Stack a b' ma instancję, zależność funkcjonalna' a-> b' może znacząco pomóc maszynie wnioskowania typu. W przeciwnym razie każde wywołanie 'pop :: a -> a' jest niejednoznaczne:' b' nie może być określone z kontekstu 'pop'. (Oczywiście można również użyć rodziny typów.) – chi
@chi: IIRC można dodać ograniczenia, takie, że będzie tylko jeden taki 'b' dla' a'. Sprawdzę to później. –