以下如何减少?
How does the following reduce?
我有以下程序来添加三个数字:
(define add-3 (lambda (x y z) (+ x y z)))
(add-3 100 200 300)
; 600
将其转换为柯里化函数时,它会简化为如下所示,
(apply (lambda args1
(apply add-3 (cons 100 args1)))
'(200 300))
; 600
我的问题是以上如何进一步减少?例如,如果我在列表中替换 args1
=(200 300)
我会得到以下内容:
(apply (lambda args1
(apply add-3 (cons 100 args1)))
'(200 300))
(apply
(apply add-3 (cons 100 '(200 300))))
但这给了我 ar arity mismatch
,所以我一定是在 reduction/substitution 中做错了什么。这样做的正确方法是什么?
我想问这个更直接的方法是如何进行以下简化?
(apply (lambda args (apply add-3 args)) '(100 200 300))
; 600
; ... how do we get here?
(apply add-3 '(100 200 300))
; 600
对于上下文:.
你问的是如何解构列表?
(define l1 (list 100 200 300))
(apply (lambda args (apply add-3 args)) l1)
(define l2 (cons 100 (cons 200 (cons 300 '()))))
(apply (lambda args (apply add-3 args)) l2)
https://en.wikibooks.org/wiki/Scheme_Programming/List_Operations
以此为基准重新开始:
(define add-3 (lambda (x y z) (+ x y z)))
(add-3 100 200 300)
; 600
然后我们从要减少的函数开始:
(apply (lambda args1
(apply add-3 (cons 100 args1)))
'(200 300))
我们如何减少这种情况?申请工作如下:
(apply + '(1 2))
( + 1 2 )
3
也就是说,它需要一个过程并将其应用于所提供列表中的参数。因此,首先,我们可以采用 'inner lambda function' 并应用它:
((lambda args1 (apply add-3 (cons 100 args1))) 200 300)
这并没有太大的简化,但我们可以设置 args1='(200 300)
来摆脱那个组件,这给了我们:
(let ((args1 '(200 300)))
(apply add-3 (cons 100 args1)))
我们可以在这里走几条路线,但为了简化事情,让我们进行 (cons 100 args1)
调用,它简化为 (100 200 300)
:
(let ((args1 '(200 300)))
(apply add-3 '(100 200 300)))
注意正文中不再有 args1
,因此我们可以删除 let
:
(apply add-3 '(100 200 300))
现在我们可以使用 (apply func args)
-> (func arg1 arg2 ...)
的应用定义来得到:
(add-3 100 200 300)
这就是我们想要的。请注意,在我们的减少中,我们能够利用以下内容:
(apply (lambda args BODY) LIST)
并将其转化为:
(let ((args LIST))
BODY)
这里最简单的例子是这样的:
(apply (lambda args (length args)) '(1 2 3 4))
; {
; BODY = (length args)
; LIST = '(1 2 3 4)
; }
; ==>
(let ((args '(1 2 3 4)))
(length args))
有关更多信息,此答案提供了额外的上下文:。
我有以下程序来添加三个数字:
(define add-3 (lambda (x y z) (+ x y z)))
(add-3 100 200 300)
; 600
将其转换为柯里化函数时,它会简化为如下所示,
(apply (lambda args1
(apply add-3 (cons 100 args1)))
'(200 300))
; 600
我的问题是以上如何进一步减少?例如,如果我在列表中替换 args1
=(200 300)
我会得到以下内容:
(apply (lambda args1
(apply add-3 (cons 100 args1)))
'(200 300))
(apply
(apply add-3 (cons 100 '(200 300))))
但这给了我 ar arity mismatch
,所以我一定是在 reduction/substitution 中做错了什么。这样做的正确方法是什么?
我想问这个更直接的方法是如何进行以下简化?
(apply (lambda args (apply add-3 args)) '(100 200 300))
; 600
; ... how do we get here?
(apply add-3 '(100 200 300))
; 600
对于上下文:
你问的是如何解构列表?
(define l1 (list 100 200 300))
(apply (lambda args (apply add-3 args)) l1)
(define l2 (cons 100 (cons 200 (cons 300 '()))))
(apply (lambda args (apply add-3 args)) l2)
https://en.wikibooks.org/wiki/Scheme_Programming/List_Operations
以此为基准重新开始:
(define add-3 (lambda (x y z) (+ x y z)))
(add-3 100 200 300)
; 600
然后我们从要减少的函数开始:
(apply (lambda args1
(apply add-3 (cons 100 args1)))
'(200 300))
我们如何减少这种情况?申请工作如下:
(apply + '(1 2))
( + 1 2 )
3
也就是说,它需要一个过程并将其应用于所提供列表中的参数。因此,首先,我们可以采用 'inner lambda function' 并应用它:
((lambda args1 (apply add-3 (cons 100 args1))) 200 300)
这并没有太大的简化,但我们可以设置 args1='(200 300)
来摆脱那个组件,这给了我们:
(let ((args1 '(200 300)))
(apply add-3 (cons 100 args1)))
我们可以在这里走几条路线,但为了简化事情,让我们进行 (cons 100 args1)
调用,它简化为 (100 200 300)
:
(let ((args1 '(200 300)))
(apply add-3 '(100 200 300)))
注意正文中不再有 args1
,因此我们可以删除 let
:
(apply add-3 '(100 200 300))
现在我们可以使用 (apply func args)
-> (func arg1 arg2 ...)
的应用定义来得到:
(add-3 100 200 300)
这就是我们想要的。请注意,在我们的减少中,我们能够利用以下内容:
(apply (lambda args BODY) LIST)
并将其转化为:
(let ((args LIST))
BODY)
这里最简单的例子是这样的:
(apply (lambda args (length args)) '(1 2 3 4))
; {
; BODY = (length args)
; LIST = '(1 2 3 4)
; }
; ==>
(let ((args '(1 2 3 4)))
(length args))
有关更多信息,此答案提供了额外的上下文: