为什么我需要在Haskell中使用'neg square 4.2'的大括号?

Mar*_*oma 1 haskell

我目前正在学习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应用于结果.

但显然存在问题.两个案例中有什么问题?

And*_*ewC 6

函数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.