1

我正在研究一个接收结构列表的函数,然后使用该结构列表生成一个将符号列表处理为数字的函数。每个结构都由一个符号和一个数字组成,该符号将在第二个使用的列表中。产生的这个函数必须通过根据先前的结构为每个符号分配一个值来将符号列表转换为一个数字。顺便说一句,使用抽象列表函数。

    Example: ((function (list (make-value 'value1 10) (make-value 'value2 20)))
              (list 'value1 'value2 'nothing 'value1)) would produced 40.

这是我的代码,但它仅适用于特定情况。

 (define (function lst)
   (lambda (x) (foldr + 0 (map (lambda (x) 
                           (cond
                             [(equal? x (value-name(first lst)))(value-value (first  lst))]
                             [else (value-value (second lst))]))

                             (filter (lambda (x) (member? x (map value-name lst)))x)))))
4

2 回答 2

0

看起来像家庭作业。您的解决方案的基本形状是可以的。我认为您在这里遇到问题的原因是您的代码中没有分解,因此很容易迷失在括号中。

让我们从您的想法开始,将fold整数+列表作为计算的最后一步。

对于此子任务,您有:

1) (name, value) 对的列表 2) 名称的列表

你需要得到一个值列表。编写一个单独的函数来执行此操作并使用它。像这样

(define (function lst)
   (lambda (x) (foldr + 
                      0 
                      (to-values x lst)))

(define (to-values names names-to-values)
   (map (lambda (name) 
            (to-value name names-to-values))))

(define (to-value n ns-to-vs)
     ...)

在这里,我们map结束了names另一个小功能。它将在其中查找nns-to-vs并返回它,如果没有则返回 0。

于 2013-01-19T17:30:57.297 回答
0

解决问题的方法有两种foldr,研究和理解这两种方法会很有趣。在问题中尝试的第一个是首先生成一个包含所有值的列表,然后让我们foldr负责添加它们。它可以以更简单的方式实现,如下所示:

(define (function lst)
  (lambda (x)
    (foldr +
           0
           (map (lambda (e)
                  (cond ((assoc e lst) => value-value)
                        (else 0)))
                x))))

或者:也许使用foldr是矫枉过正,应用+更简单:

(define (function lst)
  (lambda (x)
    (apply +
           (map (lambda (e)
                  (cond ((assoc e lst) => value-value)
                        (else 0)))
                x))))

在第二种方法中,我们“按原样”获取输入列表并让我们foldr执行lambda加法逻辑。这比使用的第一种方法更有效foldr,因为不需要创建中间列表 -map在第一个版本中生成的列表:

(define (function lst)
  (lambda (x)
    (foldr (lambda (e a)
             (cond ((assoc e lst) => (lambda (p) (+ a (value-value p))))
                   (else a)))
           0
           x)))

在这两种方法中,我都assoc用于在列表中查找元素;如果您不允许使用它或者如果它不适用于使用 : 创建的值,它很容易实现为辅助函数make-valueassoc获取名称-值对列表并返回具有给定名称的第一对。的=>语法cond将返回的对传递assoc给 alambda的参数并执行它。

而且因为您使用的是 Racket,所以有一些语法糖可用于从另一个函数返回一个函数,为了简单起见,试试这个等效代码:

(define ((function lst) x)
  (foldr +
         0
         (map (lambda (e)
                (cond ((assoc e lst) => value-value)
                      (else 0)))
              x)))

或这个:

(define ((function lst) x)
  (foldr (lambda (e a)
           (cond ((assoc e lst) => (lambda (p) (+ a (value-value p))))
                 (else a)))
         0
         x))

无论如何,结果如预期:

((function (list (make-value 'value1 10) (make-value 'value2 20)))
 (list 'value1 'value2 'nothing 'value1))
=> 40
于 2013-01-19T19:42:06.207 回答