[Haskell-beginners] How does the type of "ap = liftM2 id" work?
Brandon S. Allbery KF8NH
allbery at ece.cmu.edu
Fri Aug 22 13:24:26 EDT 2008
On 2008 Aug 22, at 13:07, Quergle Quergle wrote:
> id :: a -> a
> liftM2 id :: (Monad m) => m (a2 -> r) -> m a2 -> m r
> My intuitive understanding is that liftM2 is expecting a two-argument
> function as its first argument, so it seems a little unexpected to
> pass it "id", a one-argument function. And I can't really see how the
That's not quite how types work. "a -> a", with nothing constraining
the "a", can be *any* type... including a function type. And because
in Haskell a multiple-argument function is identical to a single-
argument function returning a single-argument function, the type of
"id" encompasses any number of arguments.
So, "liftM2 id" constrains "id" by usage (as you noted, it requires a
2-argument function) to have the type "(a -> b) -> (a -> b)" instead
of "a -> a", and now it works.
brandon s. allbery [solaris,freebsd,perl,pugs,haskell] allbery at kf8nh.com
system administrator [openafs,heimdal,too many hats] allbery at ece.cmu.edu
electrical and computer engineering, carnegie mellon university KF8NH
More information about the Beginners