我目前正在学习Haskell的99个问题,我.在一个解决方案中看到过.它似乎是数学中已知的常用函数组合:
f ? g
Run Code Online (Sandbox Code Playgroud)
我想确保我已正确理解它并创建了这个示例:
square x = x*x
neg x = (-1)*x
main = do
-- let result = neg (square 4.1) -- works
-- let result = square (neg 4.2) -- works
-- let result = neg $ square 4.3 -- works
let result = neg square 4.4 -- doesn't work
-- let result = neg . square 4.5 -- doesn't work
-- let result = neg . square $ 4.6 -- works
-- let result = neg square $ 4.7 -- does not work
print result
Run Code Online (Sandbox Code Playgroud)
可悲的是,只有前三行有效(至少它们按预期工作).
为什么我在下面两种情况下需要牙套?我以为你不需要它们,因为我认为用点来neg获取square输入.所以它仍然是一个功能,看起来像
(-1)*x*(-1)*x
Run Code Online (Sandbox Code Playgroud)
然后4.4放在那里x应该没问题.
我认为如果没有点,Haskell首先应用于square4.5然后neg应用于结果.
但显然存在问题.两个案例中有什么问题?
函数application() has the highest precedence of all the operators in Haskell, so
neg . square 4.5意思是neg . (square 4.5),没有意义,因为它(square 4.5)是一个数字,而不是一个函数,所以你不能用它来组合它neg.
并且neg square $ 4.7意味着(neg square) $ 4.7,但square功能不是数字,所以你不能neg.