Equality instance for lists

On Sat, Nov 30, 2013 at 5:40 PM, Patrick Browne
I am trying to write my own simplified class and instances for equality. I have trouble with the equality equation for the empty list. Even though I can use the [] == [] at the GHCi prompt I cannot use it in my equality test. How can I make my eq test handle empty lists while staying within the context of my current code?.
You can't unless you include an Eq constraint on a, since Eq is what "defines" (==). In your other instance, you use Int and Int has an Eq instance. ghci can do it because of extended defaulting: it uses () for a, and there is an Eq instance for (). But this would not help you in an instance definition. -- brandon s allbery kf8nh sine nomine associates allbery.b@gmail.com ballbery@sinenomine.net unix, openafs, kerberos, infrastructure, xmonad http://sinenomine.net

On Sat, Nov 30, 2013 at 10:40:59PM +0000, Patrick Browne wrote:
Hi, I am trying to write my own simplified class and instances for equality. I have trouble with the equality equation for the empty list. Even though I can use the [] == [] at the GHCi prompt I cannot use it in my equality test. How can I make my eq test handle empty lists while staying within the context of my current code?. Thanks, Pat
class Eq1 a where eq :: a -> a -> Bool
instance Eq1 Int where eq a b = a == b
instance Eq1 a => Eq1 [a] where -- This line compiles but gives an run time error. eq [] [] = True
This code does not give a run time error. The error you are getting is a type inference error, which has nothing to do with this code.
eq [] []
You simply need to give a type annotation on one of the empty lists. eq ([] :: [Int]) [] The standard Eq class has some built-in magic support by GHCI (extended default rules) which means this does not apply in the case of using == directly. -Brent
participants (3)
-
Brandon Allbery
-
Brent Yorgey
-
Patrick Browne