簡體   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