繁体   English   中英

计划结构和清单

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

如果您不想使用foldmap (这可能是合理的,因为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 / foldrreduce Common Lisp中):

(reduce '+ p1 :key 'mult)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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