design-patterns - 是否可以应用模式列表和 exp 来匹配?
问题描述
我想使用match
Racket 中的函数来获取 exp0 给出的第一个元素。
(define mylist '(['c c] ['a a] ['* *]))
(match '* mylist))
但这不起作用。它会引发错误“预期带有模式和结果的子句”。我怎样才能实现它?
解决方案
(首先,您有一个小问题;我真的不认为您想在带引号的列表中引用您的键;这将产生实际上是包含符号“引号”的列表的键。基本上,只是不要放引号内的引号。)
下一步:您可能正在寻找几种不同事物中的一种。
第一个也是最明显的答案就是使用类似的东西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)
推荐阅读
- c# - dotnet core fusion 程序集在 linux 上的日志
- python - 如何使pandas read_csv中的分隔符接受定义的空格范围作为分隔符
- python - Lightgbm 排名示例
- .net - 使用 .net 核心的自定义获取方法
- google-apps-script - 使用谷歌脚本将图像添加到谷歌表单的标题
- azure - 用于获取 Azure SQL 数据库中表元数据的 API 或服务
- c++ - Pybind11 - 没有复制构造函数/运算符的类
- pandas - 熊猫数据框上的多个条件
- amazon-web-services - Amazon SES 可以在没有任何真实电子邮件地址的情况下处理电子邮件吗?
- php - 将 csv 文件从同一服务器上传到 mysql