为什么“neg square 4.2”在Haskell中需要大括号?

为什么“neg square 4.2”在Haskell中需要大括号?,haskell,Haskell,我目前正在学习Haskell,我已经看到了。在一个解决方案中。这似乎是数学中常见的函数组合: f ∘ g 我想确保我正确理解了它,并创建了以下示例: 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 -- w

我目前正在学习Haskell,我已经看到了。在一个解决方案中。这似乎是数学中常见的函数组合:

f ∘ g
我想确保我正确理解了它,并创建了以下示例:

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
可悲的是,只有前三行可以正常工作,至少它们可以正常工作

为什么在下面两种情况下我需要支架?我认为你们不需要它们,因为我认为有了点,neg可以得到平方作为输入。所以它仍然是一个函数,看起来像

(-1)*x*(-1)*x
然后把4.4放在那里,对于x,这应该是好的

我认为如果没有圆点,Haskell首先将平方应用于4.5,然后将neg应用于结果


但显然有个问题。下面两种情况的问题是什么?

在Haskell中,函数应用程序是左关联的,因此bcd表示bcd


您可以在以下位置了解更多信息:

在Haskell中,函数应用程序是左关联的,所以bcd表示bcd

您可以在以下网址了解更多信息:

neg的类型为

当neg只需要一个参数时,您正试图将两个参数应用于neg。 . 是函数组合,而不是串联

让结果=负。平方4.5应为结果=负。平方米4.5美元

就neg而言。您正在编写两个函数

.的类型为b->c->a->c->a->c 所以当你把它和neg组合成正方形,它就变成了neg。square::Num c=>c->c,现在接受一个参数。如果您尝试将42应用于neg。square立即,应用于square的4.4的应用将优先于应用于4.4的neg和square的组合,因为函数应用是左关联的,并且将产生类型错误。

neg的类型是

当neg只需要一个参数时,您正试图将两个参数应用于neg。 . 是函数组合,而不是串联

让结果=负。平方4.5应为结果=负。平方米4.5美元

就neg而言。您正在编写两个函数

.的类型为b->c->a->c->a->c 所以当你把它和neg组合成正方形,它就变成了neg。square::Num c=>c->c,现在接受一个参数。如果您尝试将42应用于neg。square立即,应用于square的4.4的应用将优先于应用于4.4的negand square的组合,因为函数应用是左关联的,并且将产生类型错误。

函数应用在Haskell中的所有运算符中具有最高的优先级,因此

负数。正方形4.5表示负。正方形4.5没有意义,因为正方形4.5是一个数字,不是一个函数,所以不能用neg组合

负平方$4.7表示负平方$4.7,但平方是一个函数而不是一个数字,所以不能负它。

函数应用程序在Haskell中的所有运算符中具有最高的优先级,所以

负数。正方形4.5表示负。正方形4.5没有意义,因为正方形4.5是一个数字,不是一个函数,所以不能用neg组合


neg square$4.7表示neg square$4.7,但square是一个函数而不是一个数字,因此不能对其进行neg。

因为infixr为.,$指定了优先级,并为函数应用程序neg指定了优先级。平方4.5==。负广场4.5,负。平方$4.6==$。neg square 4.6和neg square$4.7==$neg square 4.7,因为infixr为、$指定了优先级,函数应用程序隐含了优先级,neg。平方4.5==。负广场4.5,负。平方$4.6==$。负平方4.6,负平方$4.7==负平方$4.7
neg:: Num a => a -> a