[英]scheme structures and lists
(define-struct position (name numshares share-price))
(define p1
(cons (make-position "INT" 10 192) (cons (make-position "SSS" 4 42)
empty)))
mult
是我的帮手功能
(define (mult n)
( * (position-numshares n)
(position-share-price n)))
const将位置numshares和position-share-price放在一个列表中并将它们相乘。
(define (const n)
(cond
[(empty? n) empty]
[(cons? n)
(+ (mult (first n))
)]))
我想要做的是获取列表的第一个并将列表的其余部分添加到一起。 相反,我只获得了第一个列表。 所以如果我这样做(const p1)我只得到1920,但我想得到2088(10 * 192 + 4 * 42)。 我尝试过其余的重复,但得到一个错误。 我可能遗漏了一些简单的东西。 帮助将不胜感激。
首先,请注意,一般情况下,您可以这样做
(list a b)
代替
(cons a (cons b empty))
所以你用p1
定义p1
(define p1
(list (make-position "INT" 10 192)
(make-position "SSS" 4 42)))
这更容易阅读,并使您的意图更清晰。 现在,让1920
从创建的结构(make-position "INT" 10 192)
已经定义了你的辅助程序mult
。 您可以map
mult
在你的名单p1
,以获得产品,即一个新的列表, (1920 168)
然后,您可以在该列表上使用带有+
和0
foldl
来计算其总和。
(define (const lst)
(foldl + 0 (map mult lst)))
(const p1)
;=> 2088
如果您不想使用fold
和map
(这可能是合理的,因为map
意味着正在分配新列表),您可以手动编写:
(define (const lst)
(let const ((sum 0) (lst lst)) ; pretty much an implementation of fold, but
(if (null? lst) ; with the function + built in, and mult applied
sum ; to each element before passing to +
(const (+ sum (mult (car lst)))
(cdr lst)))))
(const p1)
;=> 2088
另一种选择是使用foldl
,但不是传递+
,而是传入一个结合了+
和mult
的函数:
(define (const3 lst)
(foldl (lambda (struct sum)
(+ (mult struct) sum))
0
lst))
(const3 p1)
作为Common Lisper,对我来说有点令人失望的是,Scheme的foldl
过程没有采用在应用函数之前应用于列表的每个元素的关键参数。 在Common Lisp中,我们会写( foldl
/ foldr
的reduce
Common Lisp中):
(reduce '+ p1 :key 'mult)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.