我必须在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))))
有没有改变这个以允许我需要的东西?
答案 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))))))