
On 25 November 2010 01:44, Paul Sargent
I'm aware that 'ap' is related the liftM, but what is this monad, and why are we working in a monad at all?
...and surely this isn't the same as the original code as we now have a different type signature?_______________________________________________
Its the Reader monad. The Reader monad introduces a "static argument" into the computation. The code is equivalent to the original - if you want you can declare it as a binding without generalizing it to Monad: Prelude Control.Monad> let f = ap (+) id :: Num a => a -> a Pointfree is presumably introducing it because it can't find elementary definitions that are only functional types - the combinators in the Haskell Prelude and Data.Function are perhaps a little meagre. In one stroke it is a use of the 'w' combinator: f :: Num a => a -> a f = w (+) -- | W combinator - warbler - elementary duplicator. w :: (r1 -> r1 -> ans) -> r1 -> ans w f x = f x x Monadic ap for the Reader monad corresponds to the Starling 's' combinator, so it is also: g :: Num a => a -> a g = starling (+) id Again, Pointfree doesn't have starling available: starling :: (r1 -> a -> ans) -> (r1 -> a) -> r1 -> ans starling f g x = f x (g x)