2014-02-24 66 views
1

我目前正在学习Haskell与99 questions和我在一个解决方案中看到.。这似乎是在数学知通常的功能组成:为什么在Haskell中需要花括号为'neg square 4.2'?

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 

可悲的是,只有前三行工作(至少他们按预期工作)。

为什么我需要在较低2案件括号?我以为你不会需要他们,becasue我认为用点,neg得到square作为输入。所以它仍然是一个函数,看起来像

(-1)*x*(-1)*x 

然后4.4摆在那里了x这应该是罚款。

我认为没有点,Haskell首先应用square到4.5,然后neg应用于结果。

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

+0

由于'infixr'指定了'.','$'(以及函数应用暗示)的优先级,'neg。平方4.5 ==(。)(neg)(square 4.5)','neg。方$ 4.6 ==($)((。)(NEG)(平方))(4.6)'和'负方$ 4.7 ==($)(NEG(广场))(4.7)' –

回答

0

类型的neg

neg:: Num a => a -> a 

您正在尝试应用两个参数NEG时只需要一个。 (.)是函数的组合物,而不是串联。

let result = neg . square 4.5应该let result = neg . square $ 4.5

在您正在撰写两个函数的neg . square情况。

类型的(.)(b -> c) -> (a -> c) -> a -> c 所以,当你与negsquare变得neg . square :: Num c => c -> c,现在有一个参数合成它。如果您尝试立即应用到42neg . square4.4应用于square应用将优先应用于4.4(因为函数应用是左联)的negsquare的组成和会产生一个错误类型。

6

功能的应用程序()在哈斯克尔所有运营商的优先级最高,所以

neg . square 4.5意味着neg . (square 4.5),这没有任何意义,因为(square 4.5)是一个数字,而不是一个功能,所以你不能用neg撰写。

neg square $ 4.7意味着(neg square) $ 4.7,但square是一个函数不是一个数字,所以你不能neg它。

相关问题