匹配如果无序列表中的两个值相同

时间:2016-04-07 20:35:03

标签: pattern-matching racket equality

我有一个带有一些值(list 'foo 'bar 2 #t 42 9 2 'some)的球拍列表。实际上,这些值遵循一些更具体的模式,但对于这个问题,这是无关紧要的。我想测试测试列表中是否有两个相同的值,在这种情况下是数字2,并获取元素和其他元素。这是我的尝试:

#lang racket

(match (list 'foo 'bar 2 #t 42 9 2 'some)
  [(list-no-order a a rest ...)
     "Do some stuff"]
  [_ "Do some other stuff"])

模式为(list-no-order a a rest ...)。但该计划的解释失败了:

a11: unbound identifier;
 also, no #%top syntax transformer is bound in: a11

对我来说,转换宏时看起来很错误。如果将list-no-order更改为list,则模式可以正常工作,但当然只有元素位于列表的开头时才会有效。

我的模式是错误的,如果是这样,如何纠正它或者预期的模式是不可能的,解决它的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

目前,最好的解决方法是使用#:when条件:

#lang racket

(match (list 'foo 'bar 2 #t 42 9 2 'some)
  [(list-no-order a b rest ...)
   #:when (equal? a b)
   "Do some stuff"]
  [_ "Do some other stuff"])

答案 1 :(得分:0)

我想知道你为什么试图模仿匹配的东西。通过你的问题和代码我不清楚。我会通过纯列表处理来处理你的问题(至少据我所知)

(filter
    (lambda (x)
        ;;filter for the first element of the prev created tuple and 
        ;;check if its larger than 1
        (> (first x) 1))
    (map
        (lambda (x)
            ;;tuple of the length of the prevously created group and the group itself
            (cons (length x) x))
        (group-by
            ;;just the element it seld
            (lambda (x)
                x)
            (list 'foo 'bar 2 #t 42 9 2 'some))))