Utilicé un contexto de tipo al hacer una declaración de instancia para un tipo de datos que hice.Haskell Tipo Contexto de declaración de instancia requerida en las funciones
data Set a = Insert a (Set a) | EmptySet
instance (Show a) => Show (Set a) where
show x = "{" ++ show' x ++ "}" where
show' (Insert x EmptySet) = show x
show' (Insert x xs) = show x ++ ", " ++ show' xs
instance Eq a => Eq (Set a) where
(Insert x xs) == (Insert y ys) = (x == y) && (xs == ys)
Así que ahora, tengo que añadir el contexto tipo de ecuación a todas las funciones que definen esa utiliza mi tipo de lance, como tal, o me sale un error de tipo:
memberSet::Eq a =>a->Set a->Bool
memberSet _ EmptySet = False
memberSet x (Insert y ys)
| x == y = True
| otherwise = memberSet x ys
subSet::Eq a=>Set a->Set a->Bool
subSet EmptySet _ = True
subSet (Insert a as) bs
| memberSet a bs = subSet as bs
| otherwise = False
El error Obtengo mi apariencia como:
No instance for (Eq a)
arising from a use of `=='
In the expression: (x == y)
In a stmt of a pattern guard for
an equation for `memberSet':
(x == y)
In an equation for `memberSet':
memberSet x (Insert y ys)
| (x == y) = True
| otherwise = memberSet x ys
Failed, modules loaded: none.
¿Qué significa esto? ¿Por qué obtengo este error? Pensé que una vez que hice la declaración de la instancia, Haskell podría verificar automáticamente que las cosas que se comparan por "==" en mis funciones "memberSet" y "subSet" se verificaran automáticamente como instancias de "Eq?"
Editar para mayor claridad:
Mi problema es que no entiendo por qué los contextos tipo son necesarios en "MemberSet" y "subconjunto". Si los elimino así, no compila.
memberSet::a->Set a->Bool
memberSet _ EmptySet = False
memberSet x (Insert y ys)
| x == y = True
| otherwise = memberSet x ys
subSet::Set a->Set a->Bool
subSet EmptySet _ = True
subSet (Insert a as) bs
| memberSet a bs = subSet as bs
| otherwise = False
El código me da typechecks para mí.¿Qué estás dejando afuera? – bdonlan
Sospecho que hay algún tipo de error bastante sutil que involucra alcance o nombres, ya que el código dado parece estar bien. –
Mi pregunta no estaba clara. El código como es compilado. Me pregunto por qué no se compilará con el contexto de tipo en "memberset" y "subconjunto" que editaré. –