
Heinrich Apfelmus wrote:
Michael Mossey wrote:
Is there a nifty way to write
filter (\x -> x < 0.5 && x > -0.5) xs
without explicitly using x?
Maybe arrows? I have a vague understanding that arrows can "send" an argument to more than one computation.
That's a job for the reader monad.
Lambda Fu, form 53 - silent reader of truth
import Control.Monad import Control.Monad.Reader
filter (liftM2 (&&) (< 0.5) (> -0.5)) xs
Cool. I realized there was a way to think about this. I haven't used the reader monad in my own projects, but I recall it's one way to pass the same value into several functions: headTail = do h <- head t <- tail return (h,t) headTail "foo" = ('f',"oo") Note also there's no need for runReader or evalReader (at least not that I'm aware of) because unlike other monads, the reader monad is itself a function that takes the state to be read. This could be generalized to headTail2 g = do h <- head t <- tail return $ g h t headTail2 (,) "foo" = ('f',"oo") But this form: do { x <- m1; y <- m2; return $ g x y} is exactly the definition of liftM2. Specifically, liftM2 g m1 m2.