(%?) :: Int -> (Int -> Int) -> Int
x %? f = f x
m :: Int -> Int
m v = v %? \z -> z * 2 %? \z -> z + 3 %? \x -> x + z
或更简单
p :: Int -> Int
p v = v %? \z -> z * 2 %? \z -> z + 3
例如,p 4 = 20
答案 0 :(得分:2)
%?
优先级过高而且是左关联的,因此v %? \z -> z * 2 %? \z -> z + 3
与v %? \z -> z * (2 %? \z -> z + 3)
相同。
如果您希望%?
的行为类似于$
,请使用infixr 0 %?
,因此它与[{1}}具有相同的优先级和关联性。
答案 1 :(得分:2)
嗯,这将有助于了解你期待它做什么。但也许在p
中加上一些明确的括号是有帮助的:
q :: Int -> Int
q v = v %? (\z -> z * (2 %? (\z -> z + 3)))
也许你在期待更像这样的东西:
p2 :: Int -> Int
p2 v = v %? (\z -> (z * 2) %? (\z -> z + 3))
为您声明的任何运算符添加infix
声明可能是个好主意,以避免这种混淆。算术运算符具有中高优先级,但考虑到函数的功能,您可能还需要非常低的优先级。
作为一个旁边 - lambdas一直延伸到右边,但我猜这并不是什么让你绊倒。