【问题标题】:scheme structures and lists方案结构和清单
【发布时间】:2013-10-13 03:48:28
【问题描述】:
(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)。我已经尝试重复其余的,但得到一个错误。我可能缺少一些简单的东西。帮助将不胜感激。

【问题讨论】:

    标签: list scheme structure racket


    【解决方案1】:

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

    (list a b)
    

    而不是

    (cons a (cons b empty))
    

    所以你用

    定义p1
    (define p1
      (list (make-position "INT" 10 192)
            (make-position "SSS" 4 42)))
    

    这更容易阅读,并使您的意图更清晰。现在,要从(make-position "INT" 10 192) 创建的结构中获取1920,您已经定义了您的帮助程序mult。您可以通过mapmult 在您的列表p1 上获取新的产品列表,即(1920 168)。然后您可以在该列表中使用foldl+0 来计算其总和。

    (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/foldr 在 Common Lisp 中是 reduce):

    (reduce '+ p1 :key 'mult)
    

    【讨论】:

    猜你喜欢
    • 2013-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多