这是我的代码:
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)
之前,它无效。为什么会产生这样的影响?
答案 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)
。