[英]Using Racket ISL to define functions using list abstractions and local/lambda
我正在尝试设计一个函数,给定一个数字列表,返回提供的列表中偶数的平方。 我不想计算最终结果中不会使用的平方。
这就是我使用地图和过滤器的内容:
; even-squares-only : [List-of Number] -> [List-of Number]
; returns square of only even numbers in a supplied list
(define (even-squares-only lon)
(map (λ (n) (sqr n)) (filter even? lon)))
我将如何使用 foldr 函数设计相同的函数,以便我可以迭代列表的元素一次而不是两次(我也尝试在此函数中使用 local 或 lambda)?
在带有 lambda 的 ISL 中:
(define (even-squares-only lon)
(foldr (lambda (element result)
(if (even? element)
(cons (sqr element) result)
result))
'()
lon))
如果您将匿名函数重写为命名函数,则此练习甚至可以在没有local
和lambda
的情况下完成:
(define (reducing-fn element result)
(if (even? element)
(cons (sqr element) result)
result))
(define (even-squares-only lon)
(foldr reducing-fn
'()
lon))
例子:
> (even-squares-only '(1 2 3 4 5 6 7 8 9 10))
(list 4 16 36 64 100)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.