为什么以下简单的Haskell函数给出了一些奇怪的答案?

时间:2010-07-29 23:17:59

标签: haskell

(%?) :: 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

2 个答案:

答案 0 :(得分:2)

%?优先级过高而且是左关联的,因此v %? \z -> z * 2 %? \z -> z + 3v %? \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一直延伸到右边,但我猜这并不是什么让你绊倒。