
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