Lambda scheme中的函数生成器

Lambda scheme中的函数生成器,lambda,scheme,higher-order-functions,Lambda,Scheme,Higher Order Functions,我要构建的一个函数,应该把一个数字列表作为参数,并给出一个函数作为输出,其输出如下:如果列表中的数字是正数,则将其相加,如果是负数,则乘以它,如果是0,则将数字平方 例如,如果我传入(4-10),它应该返回一个函数,该函数接受单个参数,向其中添加4,将其乘以-1,将其平方,然后返回该参数 我想我的思路是对的,但我现在很困惑。我不一定在寻找解决方案,但任何帮助都会令人惊讶。以下是我目前掌握的情况: (define (buildseries L) (define (a x) (lamb

我要构建的一个函数,应该把一个数字列表作为参数,并给出一个函数作为输出,其输出如下:如果列表中的数字是正数,则将其相加,如果是负数,则乘以它,如果是0,则将数字平方

例如,如果我传入(4-10),它应该返回一个函数,该函数接受单个参数,向其中添加4,将其乘以-1,将其平方,然后返回该参数

我想我的思路是对的,但我现在很困惑。我不一定在寻找解决方案,但任何帮助都会令人惊讶。以下是我目前掌握的情况:

(define (buildseries L)
  (define (a x) 
    (lambda (y) (+ x y)))
  (define (m x) 
    (lambda (y) (* x y)))
  (define (s x) 
    (lambda (x) (* x x)))
  (define (funcfind d)
    (cond
     [(null? d) (a 0)]
     [(> d 0) (a d)]
     [(= d 0) (s d)]
     [(< d 0) (m d)]))
  (funcfind (first L)))

((buildseries '(2)) 2)
(定义(buildseries L)
(定义(a x)
(λ(y)(+xy)))
(定义(m x)
(λ(y)(*xy)))
(定义(s x)
(λ(x)(*x)))
(定义(funcfind)
(续)
[(无效?d)(a 0)]
[(>d0)(ad)]
[(=d0)(sd)]
[(

我不知道如何构建一个由其他函数组合而成的函数。。。只是觉得迷路了。

我想你很快就会找到解决办法了。如果我是你,我会定义另外两个helper函数作为
buildseries
的内部定义。一个是只返回其参数不变的
identity
函数。另一个是辅助函数,
compose
,它接受两个函数
f
g
,并返回一个新函数来计算它们的组合。这类似于
a
m
助手,它们也是“函数工厂”,返回一个匿名函数,该函数取决于它们的参数。您可以考虑将以下数学符号转换为Scheme,使用
表示函数组合:
(f.g)(x)=f(g(x))

顺便说一下,我认为您对
s
的定义不太正确:它不需要是返回lambda的“函数工厂”,而只需要是
x
的普通函数。它会像写的那样工作,但是由于您没有使用(外部)参数
x
执行任何操作,您最好将其简化为
(定义(sx)(*x))
。然后在
(=d0)
的情况下,只需返回
s
,这本身就是一个非常好的函数值

现在你需要考虑两件事。首先,你的基本情况是什么?当列表
l
为空时,返回什么函数?接下来,当
l
为非空时,如何将列表的
第一个
元素所做的一切与列表的
其余
元素递归地结合起来


希望这会有帮助。如果我能改进答案,请告诉我

我想你已经接近解决方案了。如果我是你,我会定义另外两个helper函数作为
buildseries
的内部定义。一个是只返回其参数不变的
identity
函数。另一个是辅助函数,
compose
,它接受两个函数
f
g
,并返回一个新函数来计算它们的组合。这类似于
a
m
助手,它们也是“函数工厂”,返回一个匿名函数,该函数取决于它们的参数。您可以考虑将以下数学符号转换为Scheme,使用
表示函数组合:
(f.g)(x)=f(g(x))

顺便说一下,我认为您对
s
的定义不太正确:它不需要是返回lambda的“函数工厂”,而只需要是
x
的普通函数。它会像写的那样工作,但是由于您没有使用(外部)参数
x
执行任何操作,您最好将其简化为
(定义(sx)(*x))
。然后在
(=d0)
的情况下,只需返回
s
,这本身就是一个非常好的函数值

现在你需要考虑两件事。首先,你的基本情况是什么?当列表
l
为空时,返回什么函数?接下来,当
l
为非空时,如何将列表的
第一个
元素所做的一切与列表的
其余
元素递归地结合起来


希望这会有帮助。如果我能改进答案,请告诉我

乔恩的回答很好。你应该尽可能多地实现它。如果需要,您也可以在这里参考我的答案(这与Jon的方法不同,因为我在他发布他的答案之前写了大部分答案):

您应该研究它,看看它是如何工作的,然后使用完全不同的方法编写自己的版本,就像Jon关于使用
compose
:-)的想法一样


编辑:我编写的函数可以进一步简化:使用SRFI 1的
折叠
,您可以执行以下操作:

(define (fun nums)
  (define (step num value)
    (cond ((positive? num) (+ value num))
          ((negative? num) (* value num))
          (else (* value value))))
  (lambda (x)
    (fold step x nums)))

乔恩的回答很好。你应该尽可能多地实现它。如果需要,您也可以在这里参考我的答案(这与Jon的方法不同,因为我在他发布他的答案之前写了大部分答案):

您应该研究它,看看它是如何工作的,然后使用完全不同的方法编写自己的版本,就像Jon关于使用
compose
:-)的想法一样


编辑:我编写的函数可以进一步简化:使用SRFI 1的
折叠
,您可以执行以下操作:

(define (fun nums)
  (define (step num value)
    (cond ((positive? num) (+ value num))
          ((negative? num) (* value num))
          (else (* value value))))
  (lambda (x)
    (fold step x nums)))

首先,您需要一个基本函数bulider,它接受一个数字并生成一个对应函数:

(define (num->fun d)
  (cond [(> d 0) (lambda (x) (+ x d))]
        [(= d 0) (lambda (x) (* x x))]
        [(< d 0) (lambda (x) (* x d))]))
注意,composecompose函数的顺序是相反的,所以在compose之前要反转函数列表。 你可以这样解释:

(define (buildseries L)
  (apply compose (reverse (map num->fun L))))
;try it:
((buildseries '(4 -1 0)) 1);=>25

首先,您需要一个基本函数bulider,它接受一个数字并生成一个对应函数:

(define (num->fun d)
  (cond [(> d 0) (lambda (x) (+ x d))]
        [(= d 0) (lambda (x) (* x x))]
        [(< d 0) (lambda (x) (* x d))]))
注意,composecompose的功能顺序相反,因此请将有趣的列表颠倒过来
(define (buildseries L)
  (apply compose (reverse (map num->fun L))))
;try it:
((buildseries '(4 -1 0)) 1);=>25