
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@kf8nh.com system administrator [openafs,heimdal,too many hats] allbery@ece.cmu.edu electrical and computer engineering, carnegie mellon university KF8NH