Ben wrote:
4) ross, i had to ask ghci to even believe your code type-checks!  i
didn't realize currying worked that way -- i've never thought to pass
in functions of different arities.  as an experiment, i tried

N.B. intersectionWith id == intersectionWith ($), which might cause it to make a bit more sense. ($) is an infix version of 'id' restricted to function types. But then, ($) is a weird combinator; e.g., flip($) is the T combinator for type lifting.



Prelude Data.Map> :t intersectionWith 1
intersectionWith 1
  :: (Num (a -> b -> c), Ord k) => Map k a -> Map k b -> Map k c

[...]

ps actually the first two don't make much sense to me, when i think
about it.....

In order to allow overloading of literals, discrete numeric literals are parsed as if wrapped in fromInteger(_::Integer) and continuous numeric literals are parsed as if wrapped in fromRational(_::Rational). Thus,

    Prelude> :t 1
    1 :: (Num t) => t
    Prelude> :t 1.0
    1.0 :: (Fractional t) => t

So, since intersectionWith is expecting an (a->b->c) we figure out that "1" must be interpreted as belonging to that type, which means we need a Num(a->b->c) instance.

--
Live well,
~wren
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to