使用函数列表和映射(Scheme)

时间:2013-12-07 02:22:06

标签: scheme

我必须在Scheme中创建一个函数,它接受一个值X,一个函数列表,并返回一个应用于这些函数的X列表。例如:

  

(f1 f2 ... fn)和x ==> ((f1 x)(f2 x)...(fn x))

我可以使用map来做到这一点。我知道如何将函数列表应用到另一个列表中:

(define (myMap f_list lst)
  (if (null? f_list) lst
      (map (car f_list)
           (myMap (cdr f_list) lst))))

有没有改变这个以允许我需要的东西?

2 个答案:

答案 0 :(得分:2)

你的意思是这样吗?

(define (applyAllTo fns x)
  (map (lambda (fn) (fn x)) fns))

然后

(applyAllTo (list (lambda (x) (* 2 x)) (lambda (x) (* 3 x))) 5)

==> (10 15)

答案 1 :(得分:0)

你写道:

  

在Scheme中创建一个函数,它接受一个值X,一个函数列表,并返回一个应用于这些函数的X列表。

首先,您展示的功能不太正确:

(define (myMap f_list lst)
  (if (null? f_list) 
      lst             

真的?如果第一个是空列表,则返回第二个参数?如果第一个参数是一个函数列表 - 从它的名称判断 - 为什么第二个也被称为lst?不应该是x吗?如果是,我们真的希望它在函数列表为空时返回吗?不,当函数列表为空时,没有什么可以应用我们的值,因此将x应用于列表中的每个函数的整体结果列表是......一个空列表,对吧?所以,

(define (myMap f_list x)

参数的顺序并不重要。您可以稍后更改。

  (if (null? f_list) 
      '()
      (cons                            ; construct new list node

这里你有map。为什么?我们在这里定义我们自己的类似地图的功能。 map - 类似函数构造逐个节点的输出列表,从以某种方式从输入列表中的值逐节点生成的结果。即我们逐节点地访问输入列表,并逐节点地构造结果列表。使用cons函数。

            ( .... (car f_list) .... ) ; something to do with car

之上
            (myMap (cdr f_list) x) )))

这部分是对的。那么我们如何处理car的{​​{1}}?它是什么?要调用的函数。所以我们只需要调用它 - 将f_list应用于它。 Scheme中的函数应用程序语法只是x。而已。


现在你可以做的比作业中提到的更多。例如,您可以编写一个函数,将输入列表中的每个函数两次应用于给定的参数。遵循相同的通用代码框架很容易做到:

(function argument_value)

实际上,这个骨架是folding的另一种更常见模式的实例:

(define (maplike_func a_list param)  ; args order non-important
  (if (null? a_list)
      '()
      (cons (do_something (car a_list) param)
            (maplike_func (cdr a_list) param))))

有了它,我们的功能可以表示为

(define (right_fold do_what on_null a_list)
  (if (null? a_list)
      on_null
      (do_what (car a_list)
               (lambda () (right_fold do_what on_null (cdr a_list))))))