Haskell 为什么与0匹配?

Haskell 为什么与0匹配?,haskell,pattern-matching,Haskell,Pattern Matching,嘿,我看到了下面的函数声明 half :: Int -> Int half (x+2) = 1 + (half x) half _ = 0 为什么最后一行分别与零匹配?为什么该函数起作用?回答标题问题:\u匹配任何东西 “匹配”的序曲>案例0 “匹配” 序曲>匹配的大小写 “匹配” “匹配”的序曲>案例“eek” “匹配” 前奏曲>匹配的未定义格 “匹配” 但这似乎不是你真正的问题;在您的示例中,与0不匹配,但映射到0。所以“为什么”的答案基本上是“因为它是这样定义的”。至于为什么这会产

嘿,我看到了下面的函数声明

half :: Int -> Int
half (x+2) = 1 + (half x)
half _ = 0

为什么最后一行分别与零匹配?为什么该函数起作用?

回答标题问题:
\u
匹配任何东西

“匹配”的序曲>案例0
“匹配”
序曲>匹配的大小写 “匹配”
“匹配”的序曲>案例“eek”
“匹配”
前奏曲>匹配的未定义格
“匹配”

但这似乎不是你真正的问题;在您的示例中,
0
不匹配,但映射到
0
。所以“为什么”的答案基本上是“因为它是这样定义的”。至于为什么这会产生一个有用的功能:
\uu
模式会匹配任何东西–任何与之前的模式之一不匹配的东西。现在,在你的例子中,前面的模式恰好是令人讨厌的。我认为,标准的替代方案确实更具解释性:

half x | x>=2  = 1 + half (x - 2)
half _ = 0
如果我们假装签名是

half :: Nat -> Nat
那么第二条基本上是公正的

half 1 = 0
half 0 = 0
这对于整数除法来说很明显


也许不太明显的是为什么第一条有效。但是你可以通过把
x
想象成一个递归消耗的“资源”来很容易地掌握它:你不断地从中拿走两个单位,每次在结果中增加一个。最后,结果将是原始值的一半。

要回答标题问题:
\uu
匹配任何东西

“匹配”的序曲>案例0
“匹配”
序曲>匹配的大小写 “匹配”
“匹配”的序曲>案例“eek”
“匹配”
前奏曲>匹配的未定义格
“匹配”

但这似乎不是你真正的问题;在您的示例中,
0
不匹配,但映射到
0
。所以“为什么”的答案基本上是“因为它是这样定义的”。至于为什么这会产生一个有用的功能:
\uu
模式会匹配任何东西–任何与之前的模式之一不匹配的东西。现在,在你的例子中,前面的模式恰好是令人讨厌的。我认为,标准的替代方案确实更具解释性:

half x | x>=2  = 1 + half (x - 2)
half _ = 0
如果我们假装签名是

half :: Nat -> Nat
那么第二条基本上是公正的

half 1 = 0
half 0 = 0
这对于整数除法来说很明显


也许不太明显的是为什么第一条有效。但是你可以通过把
x
想象成一个递归消耗的“资源”来很容易地掌握它:你不断地从中拿走两个单位,每次在结果中增加一个。最后,结果将是原始值的一半。

它匹配,因为要匹配的模式只是一个“变量”,所以它将匹配任何值

假设你有这个功能:

fun :: Int -> String
fun 1 = "one"
fun 2 = "two"
fun x = "other"
由于最后一个模式是一个变量,它将匹配任何不是
1
2
的数字。但是请注意,在最后一个模式中,我们实际上没有使用
x
;我们只是用它来匹配任何数字。如果我们不想为我们甚至不用的变量命名呢?答案是下划线(
)。我们只需将最后一个匹配中的
x
替换为

fun _ = "other"

它匹配是因为要匹配的模式只是一个“变量”,所以它将匹配任何值

假设你有这个功能:

fun :: Int -> String
fun 1 = "one"
fun 2 = "two"
fun x = "other"
由于最后一个模式是一个变量,它将匹配任何不是
1
2
的数字。但是请注意,在最后一个模式中,我们实际上没有使用
x
;我们只是用它来匹配任何数字。如果我们不想为我们甚至不用的变量命名呢?答案是下划线(
)。我们只需将最后一个匹配中的
x
替换为

fun _ = "other"

非常感谢。我不知道n+k模式中n>=0的这个附带条件,谢谢。我不知道在(有点奇怪的)n+k模式中n>=0的这个附带条件