Thanks for your help.

On Wed, Dec 3, 2008 at 3:47 PM, Ryan Ingram <[EMAIL PROTECTED]> wrote:
> Yes; I had a similar question, and it turns out Num is special, or
> rather, pattern matching on integer literals is special.  See the
> thread
>
> http://www.nabble.com/Pattern-matching-on-numbers--td20571034.html
>
> The summary is that pattern matching on a literal integer is different
> than a regular pattern match; in particular:
>
>> foo 1 = print "one"
>> foo _ = print "not one"
>
> turns into
>
>> foo x = if x == fromInteger 1 then "one" else "not one"
>
> whereas
>
>> bar Test = print "Test"
>> bar _ = print "Not Test"
>
> turns into
>
>> bar x = case x of { Test -> print "Test" ; _ -> print "Not Test" }
>
> In the former case, the use of (y == fromInteger 1) means that "foo"
> works on any argument within the class Num (which requires Eq),
> whereas in the latter case, the use of the constructor Test directly
> turns into a requirement for a particular type for "bar".
>
> There's no way to get special pattern matching behavior for other
> types; this overloading is specific to integer literals.
>
>  -- ryan
>
> On Wed, Dec 3, 2008 at 3:05 PM, Anatoly Yakovenko <[EMAIL PROTECTED]> wrote:
>> module Test where
>> --why does this work:
>> data Test = Test
>>
>> class Foo t where
>>   foo :: Num v => t -> v -> IO ()
>>
>> instance Foo Test where
>>   foo _ 1 = print $ "one"
>>   foo _ _ = print $ "not one"
>>
>> --but this doesn't?
>>
>> class Bar t where
>>   bar :: Foo v => t -> v -> IO ()
>>
>> instance Bar Test where
>>   bar _ Test = print $ "test"
>>   bar _ _ = print $ "not test"
>> _______________________________________________
>> Haskell-Cafe mailing list
>> [email protected]
>> http://www.haskell.org/mailman/listinfo/haskell-cafe
>>
>
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to