case 和 match 有什么区别?

use*_*628 5 case match racket

我混淆了约之间的差异matchcase。在文件中?它提到match支持通用模式匹配。

> (define (m x)
    (match x
      [(list a b c)
       #:when (= 6 (+ a b c))
       'sum-is-six]
      [(list a b c) 'sum-is-not-six]))
> (m '(1 2 3))
'sum-is-six

> (m '(2 3 4))
'sum-is-not-six 
Run Code Online (Sandbox Code Playgroud)

对于这个例子,我想我可以使用case表达式重写它。不过好像挺复杂的。我必须获得输入的长度x,也许还需要一个 lambda 函数来获取 的元素总和x并将其与6.

所以我想我们更喜欢match做模式匹配。这是真的吗?除此之外还有什么区别吗?

Ósc*_*pez 4

您自己说过,match进行一般模式匹配(一个非常强大的概念!),而case仅检查一个值是否属于多个可能(隐式引用)值列表之一。所做的只是case具有多个条件的语法糖cond,例如:

(case (+ 7 5)
  [(1 2 3) 'small]
  [(10 11 12) 'big]
  [else 'other])
Run Code Online (Sandbox Code Playgroud)

...大致相当于:

(let ((val (+ 7 5)))
  (cond ((or (equal? val 1) (equal? val 2) (equal? val 3))
        'small)
        ((or (equal? val 10) (equal? val 11) (equal? val 12))
        'big)
        (else 'other)))
Run Code Online (Sandbox Code Playgroud)

match进行一些复杂的匹配;它检查一个值是否是几种可能的模式之一,它不仅是比较值的相等性,它还根据模式检查值的类型和“形状”,我​​们甚至可以使用添加额外的约束#:when要了解这有多复杂,可以检查文档的语法部分。match