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