Haskell ::使用符号$

Sir*_* DK 1 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
Run Code Online (Sandbox Code Playgroud)

它不会工作,直到我改变cak' (x - 2) : cak' (xs)cak' $ x - 2 : cak' (xs).为什么它会产生这样的影响?

Thi*_*ilo 7

这是运营商优先考虑的问题:

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

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

您可以将" $as"作为" 之前的函数$单个参数使用$".它有点像一组括号,你不必关闭.


lef*_*out 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 :
Run Code Online (Sandbox Code Playgroud)

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