(%?) :: Int -> (Int -> Int) -> Int
x %? f = f x
m :: Int -> Int
m v = v %? \z -> z * 2 %? \z -> z + 3 %? \x -> x + z
or simpler
p :: Int -> Int
p v = v %? \z -> z * 2 %? \z -> z + 3
e.g, p 4 = 20
(%?) :: Int -> (Int -> Int) -> Int
x %? f = f x
m :: Int -> Int
m v = v %? \z -> z * 2 %? \z -> z + 3 %? \x -> x + z
or simpler
p :: Int -> Int
p v = v %? \z -> z * 2 %? \z -> z + 3
e.g, p 4 = 20
%?
has too high precedence and is left-associative, so v %? \z -> z * 2 %? \z -> z + 3
is the same as v %? \z -> z * (2 %? \z -> z + 3)
.
If you want %?
to behave like $
use infixr 0 %?
, so it has the same precedence and associativity as $
.
Well, it would help to know what you were expecting it to do. But perhaps it would help to put some explicit parentheses in p
:
q :: Int -> Int
q v = v %? (\z -> z * (2 %? (\z -> z + 3)))
Perhaps you were you expecting something more like this:
p2 :: Int -> Int
p2 v = v %? (\z -> (z * 2) %? (\z -> z + 3))
It's probably a good idea to add an infix
declaration for any operators you declare, to avoid this sort of confusion. Arithmetic operators have mid-high precedence, but given what the function does you probably want very low precedence anyway.
As an aside--lambdas extend all the way to the right, but I'm guessing that's not what's tripping you up.