Haskell ::使用符号$

时间:2017-09-27 08:01:03

标签: haskell symbols

这是我的代码:

    data = [1,2,3,4,5,6,7,8,9,10]
    cak' [] = []
    cak' (x:xs) =
        if x >= 2 then
            cak' (x - 2) : cak' (xs)
        else
            x : cak' (xs)
    run = cak' data

在我将cak' (x - 2) : cak' (xs)更改为cak' $ x - 2 : cak' (xs)之前,它无效。为什么会产生这样的影响?

2 个答案:

答案 0 :(得分:7)

这是运营商优先权的问题:

  • cak' (x - 2) : cak' (xs)(cak' (x - 2)) : (cak' (xs))

  • 相同
  • cak' $ (x - 2) : cak' (xs)cak' ( (x - 2) : cak' (xs) )

  • 相同

您可以将$视为“使用$之后的所有内容作为<{1}}之前的函数的参数。它有点像一组括号,你不必关闭。

答案 1 :(得分:5)

函数应用程序(如f x,请不要将其写为f (x) BTW)总是比任何中缀运算符绑定得更紧密(例如:,尤其是$ )。所以cak' (x - 2) : cak' xs实际上被解析为(cak' (x - 2)) : cak' xs,这不是类型检查(因为x - 2不是列表)。

另一方面,$绑定比所有其他标准的中缀运算符都要好,因为

Prelude> :i $
($) :: (a -> b) -> a -> b   -- Defined in ‘GHC.Base’
infixr 0 $
Prelude> :i :
...
infixr 5 :

...即。 :具有固定性5但$只有固定性0.因此,cak' $ (x - 2) : cak' xs被解析为(可能)正确的东西,即cak' ((x - 2) : cak' xs)