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