首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >下面的内容如何减少?

下面的内容如何减少?
EN

Stack Overflow用户
提问于 2021-06-18 22:21:49
回答 2查看 82关注 0票数 1

我有以下程序来添加三个数字:

代码语言:javascript
复制
(define add-3 (lambda (x y z) (+ x y z)))
(add-3 100 200 300)
; 600

当将它转换为一个咖喱函数时,它会简化为如下所示,

代码语言:javascript
复制
(apply (lambda args1
         (apply add-3 (cons 100 args1)))
       '(200 300))
; 600

我的问题是,如何进一步减少上述情况?例如,如果我在列表args1=(200 300)中替换,就会得到以下内容:

代码语言:javascript
复制
(apply (lambda args1
         (apply add-3 (cons 100 args1)))
       '(200 300))

(apply
 (apply add-3 (cons 100 '(200 300))))

但这给了我ar arity mismatch,所以我在还原/替换方面一定做错了什么。怎样才是正确的方法呢?

我想一个更直接的方法是,下面的简化是如何发生的?

代码语言:javascript
复制
(apply (lambda args (apply add-3 args)) '(100 200 300))
; 600

; ... how do we get here?
(apply add-3 '(100 200 300))
; 600

上下文:https://stackoverflow.com/a/68038585/651174

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-06-21 22:11:18

再次以此作为基线:

代码语言:javascript
复制
(define add-3 (lambda (x y z) (+ x y z)))
(add-3 100 200 300)
; 600

然后我们从我们想要减少的函数开始:

代码语言:javascript
复制
(apply (lambda args1
         (apply add-3 (cons 100 args1)))
       '(200 300))

我们如何减少这种情况?申请工作如下:

代码语言:javascript
复制
(apply + '(1 2))
(      +   1 2 )
3

也就是说,它需要一个过程,并将其应用于提供的列表中的参数。因此,首先,我们可以使用“内部lambda函数”并应用它:

代码语言:javascript
复制
((lambda args1 (apply add-3 (cons 100 args1))) 200 300)

这并不是一种简化,但我们可以设置args1='(200 300)以摆脱该组件,这给我们提供了:

代码语言:javascript
复制
(let ((args1 '(200 300)))
  (apply add-3 (cons 100 args1)))

我们可以在这里走几条路,但是为了简化事情,让我们执行(cons 100 args1)调用,它简化为(100 200 300)

代码语言:javascript
复制
(let ((args1 '(200 300)))
  (apply add-3 '(100 200 300)))

注意,我们的身体中不再有args1,所以我们可以删除let

代码语言:javascript
复制
(apply add-3 '(100 200 300))

现在我们可以使用(apply func args) -> (func arg1 arg2 ...)的应用定义来获得:

代码语言:javascript
复制
(add-3 100 200 300)

这正是我们想要的。请注意,在我们的缩减中,我们能够利用以下各点:

代码语言:javascript
复制
(apply (lambda args BODY) LIST)

并将其转化为:

代码语言:javascript
复制
(let ((args LIST))
    BODY)

这里最简单的例子是:

代码语言:javascript
复制
(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))

有关更多信息,此答案提供了额外的上下文:https://stackoverflow.com/a/68048663/651174

票数 2
EN

Stack Overflow用户

发布于 2021-06-18 23:13:26

你在问如何解构一份清单?

代码语言:javascript
复制
(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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68042006

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档