在" Racket"领域,作者构建了一个用于教育目的的内置函数。
他们对ormap的实现是:
(define (my-ormap-book pred lst)
(cond [(empty? lst) #f]
[else (or (pred (first lst))
(my-ormap-book pred (rest lst)))]))
在许多情况下,这段代码似乎运行良好,比如下面的单元测试:
(require rackunit)
(check-equal? (my-ormap-book add1 '(3 4 5)) 4)
(check-equal? (my-ormap-book add1 '()) #f)
(check-equal? (my-ormap-book positive? '(1 2 a)) #t)
然而,真实的Ormap,如球拍文档显示 - link - 也适用于两个或多个列表作为输入,例如:
(check-equal? (ormap + '(1 2 3) '(4 5 6)) 5)
使用"实施Racket&#34实施的测试时,您会得到:
(check-equal? (my-ormap-book + '(1 2 3) '(4 5 6)) 5)
my-ormap-book: arity mismatch;
the expected number of arguments does not match the given number
expected: 2
given: 3
arguments...:
我该如何解决这个问题? 如何制作" my-ormap-book"程序传递给这个测试用例?
答案 0 :(得分:0)
内置的ormap处理多个列表是对的。我想我会把你的问题分成两个问题。首先:如何定义一个带有可变数量参数的函数(称为“variadic”)?第二:如何定义可变参数ormap?
回答第一个问题:有几种方法可以定义可变参数函数。最简单的是在参数列表中使用一个点,在最后一个参数之前:
(define (f a b . rest-args)
(first rest-args))
前两个之后的所有参数都捆绑到具有给定名称的列表中。
这个完全无用的函数接受两个或多个参数,并返回第三个参数(好吧,没有意义的和已损坏)。
回答你的另一个问题......好吧,这是一个同时递归多个相同长度列表的问题,我想我会把你推荐给section 23.1 of HtDP 2e。