【发布时间】:2021-09-14 14:47:29
【问题描述】:
我想知道匹配 Racket 中的集合的模式是可能的吗?我的某些情况是代数恒等式,例如,2*a 可以是a+a。但是,目前,我匹配list,然后我必须写(or (list '* 2 a) (list '* a 2))。如果可以匹配set,那么我可以拥有(set '* 2 a),这样更容易。
【问题讨论】:
我想知道匹配 Racket 中的集合的模式是可能的吗?我的某些情况是代数恒等式,例如,2*a 可以是a+a。但是,目前,我匹配list,然后我必须写(or (list '* 2 a) (list '* a 2))。如果可以匹配set,那么我可以拥有(set '* 2 a),这样更容易。
【问题讨论】:
您可以使用list-no-order。不过,它只能用于小型套装。
在需要处理数学表达式的程序中,标准技术是在使用任何匹配之前“规范化”表达式。 她的“规范化”是指按照某种顺序对参数进行“排序”。
在racket-cas 中,规范化会将数字放在符号之前。并按字母顺序对符号进行排序。
#lang racket
(require racket-cas)
(normalize '(+ b 3 a))
结果将是:
(+ 3 a b)
如果您有兴趣自己编写 CAS,我建议您 购买或借用科恩的这两本书。
https://www.amazon.com/Joel-S-Cohen/e/B001K8MI06/ref=dp_byline_cont_pop_ebooks_1
【讨论】: