If statement 方案:我的代码有什么问题?

If statement 方案:我的代码有什么问题?,if-statement,lambda,scheme,If Statement,Lambda,Scheme,这个问题可能很简单,但我花了一些时间在上面,我不知道问题是什么。我不熟悉这个计划;) 好的,这是我的代码: (define foo (lambda (x) ((if(equal? (car x) 4) "A" "B") (if(equal? (car (cdr x)) 3) "A" "B") (if(equal? (car(cdr (cdr x))) 5) "A" "B")

这个问题可能很简单,但我花了一些时间在上面,我不知道问题是什么。我不熟悉这个计划;) 好的,这是我的代码:

(define foo
        (lambda (x)
              ((if(equal? (car x) 4) "A" "B")
               (if(equal? (car (cdr x)) 3) "A" "B")
               (if(equal? (car(cdr (cdr x))) 5) "A" "B")
               )
               ))


(foo '(4 3 5))
当我运行代码时,出现以下错误:

>  application: not a procedure;  expected a procedure that can be
> applied to arguments   given: "A"   arguments...:    "A"    "A"

因为lambda的主体用括号括起来,第一个
if
被视为一个过程,当它尝试将另一个
if
的结果应用到它时,您会得到您得到的错误


如果您试图返回这3个
If
的值列表,那么您应该使用
list
函数。

因为lambda的主体被括在括号中,第一个
If
被视为一个过程,当它试图将另一个
If
的结果应用到它时,你得到了你得到的错误


如果您试图返回这3个
If
值的列表,则应使用
list
功能。

要修复错误,只需执行以下操作:

(define foo
  (lambda (x)
    (if (equal? (car x) 4) "A" "B")
    (if (equal? (car (cdr x)) 3) "A" "B")
    (if (equal? (car (cdr (cdr x))) 5) "A" "B")))
问题出在哪里?在您的代码中,在
if
表达式周围有一对额外的、错误的
()
,因此Scheme认为
if
正在返回一个函数(不是)。记住,在这个模式中:
(f)
意味着:作为一个没有参数的函数执行
f

现在我们发现了语法错误,让我们看看代码还有什么问题。首先,如果在过程中编写一系列表达式,则只返回最后一个表达式的值,因此前两个
if
s将被完全忽略!阅读注释后,我了解到您希望为输入返回
“AAA”
(4 3 5),或为输入返回
“ABA”
(4 6 5)。这里的技巧是我们必须使用
string append
将所有字符串粘在一起:

(define foo
  (lambda (x)
    (string-append
     (if (equal? (car x) 4) "A" "B")
     (if (equal? (cadr x) 3) "A" "B")
     (if (equal? (caddr x) 5) "A" "B"))))
现在它如预期的那样工作:

(foo '(4 3 5))
=> "AAA"
(foo '(4 6 5))
=> "ABA"

要修复错误,只需执行以下操作:

(define foo
  (lambda (x)
    (if (equal? (car x) 4) "A" "B")
    (if (equal? (car (cdr x)) 3) "A" "B")
    (if (equal? (car (cdr (cdr x))) 5) "A" "B")))
问题出在哪里?在您的代码中,在
if
表达式周围有一对额外的、错误的
()
,因此Scheme认为
if
正在返回一个函数(不是)。记住,在这个模式中:
(f)
意味着:作为一个没有参数的函数执行
f

现在我们发现了语法错误,让我们看看代码还有什么问题。首先,如果在过程中编写一系列表达式,则只返回最后一个表达式的值,因此前两个
if
s将被完全忽略!阅读注释后,我了解到您希望为输入返回
“AAA”
(4 3 5),或为输入返回
“ABA”
(4 6 5)。这里的技巧是我们必须使用
string append
将所有字符串粘在一起:

(define foo
  (lambda (x)
    (string-append
     (if (equal? (car x) 4) "A" "B")
     (if (equal? (cadr x) 3) "A" "B")
     (if (equal? (caddr x) 5) "A" "B"))))
现在它如预期的那样工作:

(foo '(4 3 5))
=> "AAA"
(foo '(4 6 5))
=> "ABA"

让我先说一句,“欢迎加入计划!”不要感到沮丧,无论你做什么,都要坚持下去 试图理解函数式编程的工作方式。 你的毅力会得到回报,你会成为一名更好的程序员 即使您重新开始使用Java,也要为此付出努力

Scheme是开始学习函数式编程的好地方

我希望以下内容将帮助您了解如何开始 改变你的想法,下面是:

这里有一点关于你为什么会看到这个奇怪的错误。如果你 拥有:

然后:

等于:

((if (equal? (car '(4 3 5)) 4) "A" "B"))
 (if (equal? (car (cdr '(4 3 5))) 3) "A" "B")
 (if (equal? (car (cdr (cdr '(4 3 5)))) 5) "A" "B"))
因为当你替换每一个事件时,这就是你得到的 在您编写的lambda表达式的主体中使用
(4 3 5)
x

下一步的推理是一种捷径,但请注意:
(汽车(435))
=
4


(汽车cdr'(4 3 5))
=
(汽车3 5))
=
3


(汽车(cdr)(4-3-5))
=
(汽车(cdr)(3-5)))
=
(汽车)(5))
=
=
5

所以,当我们在上面的表达式中用等号替换等号时, 我们得到:

这与:

("A" "A" "A")
这是一个特殊的Scheme表达式,Scheme抱怨的原因是 因为您正试图调用一个名为
“a”
的函数并将其应用于 两个参数,
“A”
“A”

从上面的讨论中,很明显你在试图 根据输入导出新结构。所以,你需要的是 一种基于检查得出新结构的函数 对现有结构进行修改,并组装一个新结构。这是什么 由函数返回

Scheme是一种函数式语言,这意味着它非常有用 以表达为导向。在这个方案中,计算机变成了一种 机械表达式计算器。这与我的想法大不相同 我们在面向对象语言(如Java、, 因为这些语言都是关于小心控制的 可变状态。在函数式语言中,都是关于 计算表达式的值。(顺便说一下,在一个很深的 这是一个很好的方式,你所能做的一切 在世界上做“可变状态编程”可以在 “表达式的机械评估”的世界。有一个 信不信由你,这两者之间有着深刻而根本的对等。)

如果您正试图创建一个新的列表,则基于个人的测试 元素,然后您需要编写 两件独立的事情:从较小的事情构造列表,并检查 列表的各个元素(在本例中为4、3和5。)

因此,
(foo'(4 3 5))
产生
(“A”“A”“A”)
,这是一个字符串列表。 您最终希望将它们全部附加到一个字符串中, 正当因此,已经有一个名为
fold right的函数提供了 这样做的方法。
fold right
函数可以使用字符串append 完成此任务的功能:

(fold-right string-append "" (foo '(4 3 5)))
哪个应该提供一个answ
(fold-right string-append "" (foo '(4 3 5)))
(fold-right string-append "" (foo '(4 4 4)))