首页 > 解决方案 > 是否可以应用模式列表和 exp 来匹配?

问题描述

我想使用matchRacket 中的函数来获取 exp0 给出的第一个元素。

(define mylist '(['c c] ['a a] ['* *]))

(match '* mylist))

但这不起作用。它会引发错误“预期带有模式和结果的子句”。我怎样才能实现它?

标签: design-patternsracketmatching

解决方案


(首先,您有一个小问题;我真的不认为您想在带引号的列表中引用您的键;这将产生实际上是包含符号“引号”的列表的键。基本上,只是不要放引号内的引号。)

下一步:您可能正在寻找几种不同事物中的一种。

第一个也是最明显的答案就是使用类似的东西dict-ref

#lang racket

(define mylist '([c c] [a a] [* *]))

(dict-ref mylist '*)

...产生列表'(*)。您可以阅读 dict-ref 上的文档以了解为什么它是一个列表。

在您真正想要使用为您提供的更丰富的匹配语义之前,这将正常工作match。如果您只想使用相等进行匹配,只需使用上面的解决方案。

因此,假设您正在寻找一个由字母 'a 后跟一个数字组成的键:

#lang racket

(define mylist
  '([(c b) c]
    [(a 3) a]
    [(* *) *]))

(findf (match-lambda [(list (list 'a (? number?)) _) #t]
                     [other #f])
       mylist)

推荐阅读