Scheme在返回true之前匹配列表中的所有给定值

时间:2017-04-23 06:40:37

标签: scheme lisp racket

我的功能有问题,我只能匹配列表中的1个元素,只要它遇到第一个匹配就会产生#t。但我希望能够匹配列表中的所有值。

说x1(1111.9999),它们都应该与列表x2匹配(1111.124123.3781283.1298394.9999)然后才返回#t

如果x2(1111.124123.3781283.1298394)是这样的,则返回#f。

感谢任何帮助。

3 个答案:

答案 0 :(得分:0)

这是一个小例子:

(define (example xs)
  (match xs
    [(list 1111 middle ... 9999)  middle]
    [_                            #f]))

并在使用中:

> (example '(1111 2 3 4 9999))
'(2 3 4)
> (example '(1111 2 3 4 5))
#f

请注意,如果列表匹配,则返回中间部分。 如果列表不匹配,则返回false。

答案 1 :(得分:0)

认为我正确理解你的问题。如果是,请查看andmap

(define (match-all xs ys)
  (not (not (andmap (λ (x) (member x ys))
                    xs))))

(match-all '(1 4 5) '(0 1 2 3 4 5 6)) ;; #t, each (1 4 5) is found in (0 1 2 3 4 5 6)
(match-all '(1 5 9) '(0 1 2 3 4 5 6)) ;; #f, 9 is not found in (0 1 2 3 4 5 6)

如果你想在没有内置插件的情况下编写它,我们可以编写一个多功能的程序

(define (match-all xs ys)
  (define (member? x ys)
    (cond ((empty? ys) #f)
          ((eq? x (car ys)) #t)
          (else (member? x (cdr ys)))))
  (define (loop xs ys)
    (cond ((empty? xs) #t)
          ((member? (car xs) ys) #t)
          (else (loop (cdr xs) ys))))
  (loop xs ys))

否则,最好使用泛型实现通用过程并构建新过程。这有助于降低复杂性并降低认知负荷

(define (andmap f xs)
  (if (empty? xs)
      #t
      (let (x (f (car xs)))
        (if (eq? #f x)
            #f
            (and x (andmap f (cdr xs)))))))

(define (member? x ys)
  (cond ((empty? ys) #f)
        ((eq? x (car ys)) #t)
        (else (member? x (cdr ys)))))

(define (match-all xs ys)
  (andmap (lambda (x) (member? x ys)) xs))

答案 2 :(得分:0)

如果我理解正确,只有在list2中找到list1的所有元素时才想返回true。如果这是正确的那么你的匹配 - 只需要一个带有三个选项的cond语句(或等效结构):

 match-all applied to list1 and list2 is
   if list1 is empty return true
   elseif the car of list1 is not a member of list2 return false
   otherwise return match-all applied to the cdr of list1 and all of list2