为什么_匹配0?

wor*_*nga 1 haskell pattern-matching

嘿,我见过以下函数声明

half :: Int -> Int
half (x+2) = 1 + (half x)
half _ = 0
Run Code Online (Sandbox Code Playgroud)

为什么最后一行与零匹配,为什么该功能有效?

lef*_*out 9

要回答标题问题:_匹配任何内容.

Prelude> _的案例0 - >"匹配"
"匹配"
Prelude> case _ - >"匹配"
"匹配"
前奏>案例"Eeeek"_ - >"匹配"
"匹配"
前奏>案例未定义_ - >"匹配"
"匹配"

这似乎不是你的问题; 在您的示例_中不匹配 0,但映射到 0.因此,"为什么"的答案基本上是"因为它是以这种方式定义的".至于为什么这会产生一个有用的功能:_模式再次匹配任何东西 - 任何与先前模式之一不匹配的东西.现在,在你的情况下,先前的模式碰巧是一个讨厌的n+k模式,在现代Haskell中实际上并不合法.我认为标准的替代方案确实更具有解释性:

half x | x>=2  = 1 + half (x - 2)
half _ = 0
Run Code Online (Sandbox Code Playgroud)

所以,如果我们假装签名是

half :: Nat -> Nat
Run Code Online (Sandbox Code Playgroud)

那么第二个条款基本上就是

half 1 = 0
half 0 = 0
Run Code Online (Sandbox Code Playgroud)

这对整数除法有明显的意义.

可能不那么明显的是第一个条款有效的原因.但是你可以很容易地把它想象x成一种递归消耗的"资源":你不断从它中取出两个单位,每次都加一个结果.最后,结果将是x原始值的一半.