微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SICP/Scheme中的apply函数

如何解决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; }; 进行编码,而不是如何使用它。

can be coded as

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 举报,一经查实,本站将立刻删除。