在“Programming F#”中,我遇到了像这样的模式匹配(我简化了一点):

let rec len list = 
  match list with
  | [] -> 0
  | [_] -> 1
  | head :: tail -> 1 + len tail;;

实际上,我知道最后一个匹配可以识别列表的头部和尾部。从概念上讲,我不明白它为什么有效。据我所理解, ::是 cons 运算符,它在列表的头部位置附加一个值,但在我看来它不像在这里被用作运算符。我是否应该将其理解为列表的“特殊语法”,其中 ::根据上下文被解释为运算符或“匹配模式”?或者可以使用其他运算符将相同的想法扩展到列表以外的类型吗?

有帮助吗?

解决方案

除了Brian的回答之外,还有几点值得注意。这 h::t 语法既可以用作运算符 作为模式:

let l = 1::2::[]                    // As an operator
match l with x::xs -> 1 | [] -> 0   // As a pattern

这意味着它是一个有点特殊的构造,因为其他运算符(例如 +) 不能用作模式(用于将结果分解回运算符的参数) - 显然,对于 +, ,这将是不明确的。

另外,图案 [_] 很有趣,因为它是嵌套模式的示例。其组成为:

  • _ - 下划线模式,匹配任何值并且不绑定任何符号
  • [ <pattern> ] - 单元素列表模式,它匹配具有单个元素的列表,并将列表的元素与嵌套的元素匹配 <pattern>.

你也可以写 match 1::[] with | [x] -> x 这将返回单个元素的值(在本例中为 1)。

其他提示

这是列出特殊的语法。您可正是如此认为list类型为区分联合的:

type list<'T> =         // '
    | Nil
    | Cons of 'T * list<'T>

除了有特殊的语法,使得Nil[]Cons(h,t)h::t。然后,它的可识别联合只是正常的模式匹配。这是否帮助?

(也可能见此博客条目。)

它是用来作为格式化器或正式pattern,`列表”被匹配到三个模式:

[]意味着该列表为空

[_]指列表中有一个元素,因为你不关心的元素是什么,所以干脆就把_那里,你也可以用[A]。

头::尾装置,该列表确实有两个部分:一个头部和尾部。

可以如果然后else结构查看F#图案匹配作为强大。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top