过滤器、映射、构建列表和本地函数在Racket/Scheme中的惯用用法?
我正在自己研究HtDP的用法,想知道这是否是各种函数的惯用用法。这就是我到目前为止所做的:过滤器、映射、构建列表和本地函数在Racket/Scheme中的惯用用法?,scheme,racket,htdp,Scheme,Racket,Htdp,我正在自己研究HtDP的用法,想知道这是否是各种函数的惯用用法。这就是我到目前为止所做的: (define-struct ir (name price)) (define list-of-toys (list (make-ir 'doll 10) (make-ir 'robot 15) (make-ir 'ty 21) (
(define-struct ir (name price))
(define list-of-toys (list
(make-ir 'doll 10)
(make-ir 'robot 15)
(make-ir 'ty 21)
(make-ir 'cube 9)))
;; helper function
(define (price< p toy)
(cond
[(< (ir-price toy) p) toy]
[else empty]))
(define (eliminate-exp ua lot)
(cond
[(empty? lot) empty]
[else
(filter ir? (map price< (build-list (length lot)
(local ((define (f x) ua)) f)) lot))]))
(定义结构ir(名称价格))
(定义玩具清单(清单
(制作ir'娃娃10)
(制作ir'机器人15)
(第21条)
(制作ir‘cube 9)))
;; 辅助函数
(定义(价格
对于我的新手来说,这看起来很难看,因为我必须定义一个本地函数才能使
构建列表
工作,因为映射
需要两个长度相等的列表。是否可以提高可读性?谢谢。我不知道构建列表是什么或是做什么的,但您肯定可以这样做:
(lambda (x) ua)
而不是:
(local ((define (f x) ua)) f)
我不知道构建列表是什么或做什么,但您肯定可以这样做:
(lambda (x) ua)
而不是:
(local ((define (f x) ua)) f)
您可以单独使用
过滤器来实现消除exp
:
(define (eliminate-exp ua lot)
(define (price< toy) (< (ir-price toy) ua))
(filter price< lot))
(定义(消除扩展ua批次)
(定义(价格<玩具)(<(ir价格玩具)ua))
(过滤价格<批次))
您可以单独使用过滤器实现消除exp
:
(define (eliminate-exp ua lot)
(define (price< toy) (< (ir-price toy) ua))
(filter price< lot))
(定义(消除扩展ua批次)
(定义(价格<玩具)(<(ir价格玩具)ua))
(过滤价格<批次))
谢谢您的回答。在这种情况下,lambda似乎很有用,但HtDP直到课程的后面(第24节)才引入它。@Greenhorn我更新了答案,这样它就不会直接使用lambda
表单。这是一个很好的答案,谢谢。它更优雅,但我需要打开Racket上的高级功能,让您的示例工作。有趣的是,filter
首先被调用,然后被调用map
,而在我的示例中,顺序是相反的。我将从中学习。在你被允许使用lambda之后,我想你会发现这是最惯用的方法。很常见的情况是,filter'或
map'采用仅用于此目的的一次性程序。在这种情况下,使用lambda将其定义为一个匿名函数,而不是在别处使用名称来定义它,这非常方便,而且可读。我之前的评论是@Greenhorn。谢谢你的回答。在这种情况下,lambda似乎很有用,但HtDP直到课程的后面(第24节)才引入它。@Greenhorn我更新了答案,这样它就不会直接使用lambda
表单。这是一个很好的答案,谢谢。它更优雅,但我需要打开Racket上的高级功能,让您的示例工作。有趣的是,filter
首先被调用,然后被调用map
,而在我的示例中,顺序是相反的。我将从中学习。在你被允许使用lambda之后,我想你会发现这是最惯用的方法。很常见的情况是,filter'或
map'采用仅用于此目的的一次性程序。在这种情况下,使用lambda将其定义为一个匿名函数,而不是在别处使用名称来定义它,这非常方便,而且可读。我之前的评论是@Greenhorn。