当前位置:  开发笔记 > 编程语言 > 正文

初学者:Scheme中的Curried函数

如何解决《初学者:Scheme中的Curried函数》经验,为你挑选了1个好方法。

我正在使用SICP讲座和文字来了解我自己的Scheme.我正在看一个练习,上面写着"表达式E的应用是形式的表达式(E E1,... En).这包括n = 0的情况,对应于表达式(E).一个Curried的应用程序E是E的应用或E的Curried应用的应用."

(编辑:我纠正了上面的引用......我最初错误地引用了这个定义.)

任务是定义一个Curried应用程序,该程序的计算结果为3

(define foo1
    (lambda (x)
        (* x x)))

我真的不明白这个想法,阅读关于Curriying的维基百科条目并没有真正帮助.

任何人都可以帮助更清楚地解释这里要求的内容吗?

实际上,即使给我这个问题的答案也会有所帮助,因为在这之后还有五个要解决.......我只是没有得到基本的想法.

另外:即使在Brian Campbell冗长的解释之后,我仍然有点失落.

(foo1 (sqrt 3)))认为是foo的应用程序,因此foo的curry应用程序?

似乎太简单了,但也许......

输入(((foo1 2 )) 2)DrScheme会出现以下错误(我有点期待)

procedure application: expected procedure, given: 4 (no arguments)

重读后什么是Currying?我明白我也可以将foo1重新定义为:

(define (foo1 a)
    (lambda (b)
        (* a b)))

那么我就可以打字了

((foo1 3 ) 4)

12

但是这并没有让我更接近于将3作为输出,并且看起来这并不是原来的foo1,它只是重新定义它.

该死的,20年的C编程还没有为此做好准备.:-) :-)



1> Brian Campbe..:

嗯,与通常更清晰的书籍风格相比,这个问题相当混乱.实际上,如果你从这里得到问题,看起来你可能会错误地设置问题集; 这可能会导致你的困惑.

我会为你打破这个定义,有一些例子可以帮助你弄清楚发生了什么.

表达式E的应用是形式(E E1 ... En)的表达.

这是一个应用程序的示例:

(foo 1 2)      ; This is an application of foo
(bar 1)        ; This is an application of bar

这包括n = 0的情况,对应于表达式(E).

(baz)          ; This is an application of baz

E的Curried应用程序是E的应用程序或E Cur的Curried应用程序的应用程序...........

这是你错误引用的那个; 以上是我在网上找到的问题集的定义.

这个定义有两半.从第一个开始:

E的Curried应用是E的应用

(foo 1 2)       ; (1) A Curried application of foo, since it is an application of foo
(bar 1)         ; (2) A Curried application of bar, since it is an application of bar
(baz)           ; (3) A Curried application of baz, since it is an application of baz

或申请E的Curried申请

((foo 1 2) 3)   ; (4) A Curried application of foo, since it is an application of (1)
((bar 1))       ; (5) A Curried application of bar, since it is an application of (2)
((baz) 1 2)     ; (6) A Curried application of baz, since it is an application of (3)
(((foo 1 2) 3)) ; A Curried application of foo, since it is an application of (4)
(((bar 1)) 2)   ; A Curried application of bar, since it is an application of (5)
                ; etc...

这会为您提供入门所需的帮助吗?

编辑:是的,(foo1 (sqrt 3))是Curried的应用程序foo1; 就这么简单.这不是一个非常好的问题,因为在许多实现中你实际上会得到2.9999999999999996或类似的东西; 除非您的Scheme具有某种精确代数数字的表示,否则不可能有一个将返回3的值.

你的第二个例子确实是一个错误.foo1返回一个无效的整数.它只是后面的一些示例,其中函数应用程序的应用程序的递归情况是有效的.foo3例如,看一看.

编辑2:我刚刚检查了SICP,看起来这里的概念直到1.3节才解释,而这个赋值只提到了1.1节.如果你还没有,我建议你仔细阅读1.3节.

推荐阅读
kikokikolove
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有