gpt4 book ai didi

lambda - 使用任意数量参数的过程的目的/用途?

转载 作者:行者123 更新时间:2023-12-01 15:07:11 27 4
gpt4 key购买 nike

在类(class)(方案)中,我们最近学习了允许函数接受任意数量参数的语法,例如;

(define len
(lambda args
(length args)))

>(len 1 2 3)
3

与最初将参数作为单个列表简单传递相比,使用这种形式有什么优势?您如何在程序中(而不是在命令行中)将参数传递给这些类型的函数?有没有办法创建一个返回一系列未包含在列表中的值的过程?

最佳答案

可变函数

一个非常有用的例子是

(define (list . elements) elements)
; or
(define list (lambda elements elements))

可变参数函数对于自然是 n 元函数的函数也很方便。例如,如果你已经有了二进制加法函数 add2,你可以这样做

(define + (lambda addends (foldl add2 0 addends)))
; or
(define (+ . addends) (foldl add2 0 addends))

除了像这样称呼这些

(+ 1 2 3)
;=> 6

当参数列表中已有参数时,您还可以使用 apply:

(apply + '(1 2 3))
;=> 6

这样做的一个好处是可以更轻松地编写使用不同参数约定的函数。我不知道这在 Scheme 中是否特别常见,但您可以使用它来获取关键字/命名参数。例如,而不是定义

(define (subseq lst start end) ...)

在你总是需要提供开始和结束参数的地方,你可以这样做

(define (subseq lst . args) ...)

因此 lst 始终是必需的,但 args 可以包含也可以不包含开始和结束参数。您可以使用它来实现默认值。例如,

(subseq lst 'start 3 'end 6) ; specify both expllicitly
(subseq lst 'end 6) ; default value for start, e.g., 0
(subseq lst 'start 4) ; default value of end, e.g., length of list
(subseq lst) ; default for both, copy the list

您必须编写代码来提取指定值或默认值,但这并不难。

多个值

至于返回多个值,您可以使用恰当命名的 values 返回多个值:

(values 1 2 3)
;=> 1
;=> 2
;=> 3

但这实际上与采用任意数量参数的函数无关,因为它们与列表相关,而 values 与列表无关。

关于lambda - 使用任意数量参数的过程的目的/用途?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19339411/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com