我使用的是Dr.Racket,中级学生和Lambda。我想知道是否有任何方法可以简化这段代码,比如lambda、抽象、映射、过滤器等等。
; alien-at-edge?: alien --> boolean
(define (alien-at-edge? an-alien)
(or (alien-at-right-edge? an-alien)
(alien-at-left-edge? an-alien)))
; any-alien-at-edge?: loa --> boolean
(define (any-alien-at-edge? a-loa)
(cond [(empty? a-loa) false]
[else (or (alien-at-edge? (first a-loa))
(any-alien-at-edge? (rest a-loa)))]))
;alien-at-left-edge?: alien --> boolean
(define (alien-at-left-edge? an-alien)
(<= (- (posn-x an-alien) ALIEN-DELTA-X) alien-half))
;alien-at-right-edge?: alien --> boolean
(define (alien-at-right-edge? an-alien)
(>= (+ (posn-x an-alien) ALIEN-DELTA-X) (- WIDTH alien-half)))
;any-alien-at-right-edge?: loa --> boolean
(define (any-alien-at-right-edge? a-loa)
(cond [(empty? a-loa) false]
[else (or (alien-at-right-edge? (first a-loa))
(any-alien-at-right-edge? (rest a-loa)))]))
;any-alien-at-left-edge?: loa --> boolean
(define (any-alien-at-left-edge? a-loa)
(cond [(empty? a-loa) false]
[else (or (alien-at-left-edge? (first a-loa))
(any-alien-at-left-edge? (rest a-loa)))]))发布于 2013-12-17 09:08:34
; alien-at-edge?: alien --> boolean
(define (alien-at-edge? an-alien)
(or (alien-at-right-edge? an-alien)
(alien-at-left-edge? an-alien)))这里没有什么可做的,但不要忘记缩进,以使您的代码可读性。
; any-alien-at-edge?: loa --> boolean
(define (any-alien-at-edge? a-loa)
(cond [(empty? a-loa) false]
[else (or (alien-at-edge? (first a-loa))
(any-alien-at-edge? (rest a-loa)))]))这种模式在函数式编程中经常发生:通过将函数(此处为or)应用到列表中来生成一个值(此处为布尔值)。您可以将您的函数重写为:
; any-alien-at-edge?: loa --> boolean
(define (any-alien-at-edge? a-loa)
(foldl or false a-loa)如果ormap很难理解,也可以使用foldl。
;alien-at-left-edge?: alien --> boolean
(define (alien-at-left-edge? an-alien)
(<= (- (posn-x an-alien) ALIEN-DELTA-X) alien-half))
;alien-at-right-edge?: alien --> boolean
(define (alien-at-right-edge? an-alien)
(>= (+ (posn-x an-alien) ALIEN-DELTA-X) (- WIDTH alien-half))) 注意缩进和尾随空格。
;any-alien-at-right-edge?: loa --> boolean
(define (any-alien-at-right-edge? a-loa)
(cond [(empty? a-loa) false]
[else (or (alien-at-right-edge? (first a-loa))
(any-alien-at-right-edge? (rest a-loa)))]))
;any-alien-at-left-edge?: loa --> boolean
(define (any-alien-at-left-edge? a-loa)
(cond [(empty? a-loa) false]
[else (or (alien-at-left-edge? (first a-loa))
(any-alien-at-left-edge? (rest a-loa)))]))这些功能也可以使用foldl实现。试试看!
发布于 2014-08-14 09:57:50
可以在一个定义中重写所有的任意函数,如下所示
(define (any predicate? a-loa)
(cond [(empty? a-loa) false]
[else (or (predicate? (first a-loa))
(any predicate? (rest a-loa)))]))标准库中也有一个findf函数。
https://codereview.stackexchange.com/questions/37576
复制相似问题