[Haskell-cafe] No instance for (Eq v) trouble
martin
martin.drautzburg at web.de
Sat Mar 22 11:50:14 UTC 2014
Hello all,
how can I make a type an instance of the Show class, if the functions used to implement show require e.g. Eq ?
--------------------------------------------
I have a class:
class Behavior b where
at :: b a -> Day -> a
and an instance
data Change v = Change v [(Day,v)]
deriving(Show)
instance Behavior Change where ...
and another instance (a Behavior of Behavior)
data WeekdayPattern v = WeekdayPattern (Change v)
instance Behavior WeekdayPattern where
at (WeekdayPattern change) day = at change (day `mod` 7)
And I wanted to write my own show function for WeekdayPattern. I started off like this:
instance Show (WeekdayPattern v) where
show wdp = show $ groupBy sameValue expanded
where
expanded = zip (map (at wdp) [0..6]) [0..6]
sameValue x y = (fst x) == (fst y)
------------------------------------------
But I get:
No instance for (Eq v)
arising from a use of `sameValue'
I believe the compiler wants to tell me, that it has no reason to assume that the values (the "v"s) can be compared for
equality. Indeed the class itself and its "at" function do not require this (but it wouldn't hurt to add a constraint)
I tried inserting an (Eq v) => in various places of the class or data declaration, but the compiler either didn't like
that or it did not solve the problem. There is no problem just writing a show-like method as in
xshow :: (Eq v, Show v) => (WeekdayPattern v) -> String
but I cannot make this the "show" function of the Show class.
More information about the Haskell-Cafe
mailing list