这是我的代码:
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).为什么它会产生这样的影响?
这是运营商优先考虑的问题:
cak' (x - 2) : cak' (xs) 是相同的 (cak' (x - 2)) : (cak' (xs))
cak' $ (x - 2) : cak' (xs) 是相同的 cak' ( (x - 2) : cak' (xs) )
您可以将" $as"作为" 之前的函数$的单个参数使用$".它有点像一组括号,你不必关闭.
函数应用程序(比如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).