如何解决SICP/Scheme中的apply函数
我在这里问了几个关于 Scheme/SICP 的问题,答案经常涉及使用 apply
过程,我在 SICP 中没有看到过,而在本书的索引中,它只列出了它有一次,结果是一个脚注。
一些用法示例基本上是这个问题的所有答案:Going from Curry-0,1,2,to ...n。
我对 apply
的工作原理很感兴趣,我想知道是否有一些示例可用。怎么把apply过程改写成另一个函数,比如像这样改写map
?
#lang sicp
(define (map func sequence)
(if (null? sequence) nil
(cons (func (car sequence)) (map func (cdr sequence)))))
(apply list '(1 2 3 4 5)) ; --> (list 1 2 3 4 5)
(apply + '(1 2 3)) ; --> (+ 1 2 3)
那么在 Python 中可能有类似的东西吗?
>>> args=[1,3]
>>> func='max'
>>> getattr(__builtins__,func)(*args)
3
解决方法
apply
用于调用具有动态参数数量的函数。
您的 map
函数只允许您调用只接受一个参数的函数。您可以使用 apply
映射具有不同数量参数的函数,使用可变数量的列表。
(define (map func . sequences)
(if (null? (car sequences))
'()
(cons (apply func (map car sequences))
(apply map func (map cdr sequences)))))
(map + '(1 2 3) '(4 5 6))
;; Output: (5 7 9)
,
您要求了解如何对 export function combineReducers<R extends any>(reducers: R) {
type keys = keyof typeof reducers;
type returnType = { [K in keys]: ReturnType<typeof reducers[K]> }
const combinedReducer = (state: any,action: any) => {
const newState: returnType = {} as any;
const keys = Object.keys(reducers);
keys.forEach(key => {
const result = reducers[key](state[key],action);
newState[key as keys] = result || state[key];
});
return newState;
}
return combinedReducer;
};
进行编码,而不是如何使用它。
apply
在 #lang sicp
; (define (appl f xs) ; #lang racket
; (eval
; (cons f (map (lambda (x) (list 'quote x)) xs))))
(define (appl f xs) ; #lang r5rs,sicp
(eval
(cons f (map (lambda (x) (list 'quote x))
xs))
(null-environment 5)))
下的 Racket 中试用:
#lang sicp
这是关于 eval
的文档的链接。
它需要一个 environment 作为第二个参数,所以我们为它提供了 > (display (appl list '(1 2 3 4 5)))
(1 2 3 4 5)
> (display ( list 1 2 3 4 5 ))
(1 2 3 4 5)
> (appl + (list (+ 1 2) 3))
6
> ( + (+ 1 2) 3 )
6
> (display (appl map (cons list '((1 2 3) (10 20 30)))))
((1 10) (2 20) (3 30))
> (display ( map list '(1 2 3) '(10 20 30) ))
((1 10) (2 20) (3 30))
,它只返回一个空的环境,它看起来像。我们在这里实际上不需要任何环境,因为此时已经完成了对参数的评估。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。