繁体   English   中英

使用 Racket ISL 使用列表抽象和本地/lambda 定义函数

[英]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))

如果您将匿名函数重写为命名函数,则此练习甚至可以在没有locallambda的情况下完成:

(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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM