0
(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 获取列表中的 position-numshares 和 position-share-price 并将它们相乘。

(define (const n)
  (cond
    [(empty? n) empty]

     [(cons? n)
       (+ (mult (first n))
                )]))

我想做的是取列表中的第一个并将列表的其余部分加在一起。相反,我只得到列表中的第一个。所以如果我这样做 (const p1) 我只会得到 1920,但我想得到 2088 (10*192 + 4*42)。我试过重复其余的,但得到一个错误。我可能缺少一些简单的东西。帮助将不胜感激。

4

1 回答 1

2

首先,请注意,一般情况下,您可以这样做

(list a b)

代替

(cons a (cons b empty))

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). 然后,您可以在该列表上使用和来计算其foldl总和+0

(define (const lst)
  (foldl + 0 (map mult lst)))

(const p1)
;=> 2088

如果您不想使用foldand 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/foldrreduceCommon Lisp 中):

(reduce '+ p1 :key 'mult)
于 2013-10-12T19:30:42.057 回答