我的功能有问题,我只能匹配列表中的1个元素,只要它遇到第一个匹配就会产生#t。但我希望能够匹配列表中的所有值。
说x1(1111.9999),它们都应该与列表x2匹配(1111.124123.3781283.1298394.9999)然后才返回#t
如果x2(1111.124123.3781283.1298394)是这样的,则返回#f。感谢任何帮助。
答案 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