Compiler errors 方案合同违反错误

Compiler errors 方案合同违反错误,compiler-errors,scheme,racket,Compiler Errors,Scheme,Racket,我不断得到一个错误,上面写着*合同违约:当它试图评估第一个AB和第二个AB时,预期的数字。我不确定这些信息是否相关,但输入的总是一个由2个数字组成的列表。您没有包含完整的示例,因此很难说是哪里出了问题。 也许您使用错误类型的参数调用复杂sqrt 这对我很有用: (define (real x) (car x)) (define (imag x) (cdr x)) (define (complex-sqrt x) (define (first a b) (sqrt (/ (+ a

我不断得到一个错误,上面写着*合同违约:当它试图评估第一个AB和第二个AB时,预期的数字。我不确定这些信息是否相关,但输入的总是一个由2个数字组成的列表。

您没有包含完整的示例,因此很难说是哪里出了问题。 也许您使用错误类型的参数调用复杂sqrt

这对我很有用:

(define (real x) (car x))
(define (imag x) (cdr x))
(define (complex-sqrt x)
    (define (first a b) (sqrt (/ (+ a
                              (sqrt (+
                                     (* a a)
                                     (* b b))))
                           2)))
    (define (second a b) (sqrt (/ (+ (* -1 a)
                               (sqrt (+
                                      (* a a)
                                      (* b b))))
                            2)))
(cons (first (real x) (imag x)) (second (real x) (real y))))
(complex-sqrt '(2 3))

你还没有包括一个完整的例子,所以很难说哪里出了问题。 也许您使用错误类型的参数调用复杂sqrt

这对我很有用:

(define (real x) (car x))
(define (imag x) (cdr x))
(define (complex-sqrt x)
    (define (first a b) (sqrt (/ (+ a
                              (sqrt (+
                                     (* a a)
                                     (* b b))))
                           2)))
    (define (second a b) (sqrt (/ (+ (* -1 a)
                               (sqrt (+
                                      (* a a)
                                      (* b b))))
                            2)))
(cons (first (real x) (imag x)) (second (real x) (real y))))
(complex-sqrt '(2 3))
更改:

#lang r5rs
(define (real x) (car x))
(define (imag x) (cdr x))
(define (complex-sqrt x)
  (define (first a b) (sqrt (/ (+ a
                                  (sqrt (+
                                         (* a a)
                                         (* b b))))
                               2)))
  (define (second a b) (sqrt (/ (+ (* -1 a)
                                   (sqrt (+
                                          (* a a)
                                          (* b b))))
                                2)))
  (cons (first  (real x) (imag x))
        (second (real x) (imag x))))

(display (complex-sqrt (cons 1 2)))
(newline)
致:

这是内置的“第二个”函数,而不是您的第二个函数。它相当于car cdr lst或列表的第二项

然后它就起作用了:

(define (imag x) (second x))
cdr x是一个列表,而第二个x是一个项目

最初的错误充分说明了这一点:

(complex-sqrt '(2 3))
; output:  '(1.6741492280355401 . 0.895977476129838)
应该缩进,因为它是复杂sqrt函数的一部分。提示:要轻松地对DrRacket中的整个代码应用适当的缩进,请选择All并按tab键

实际y应为imag x

更改:

#lang r5rs
(define (real x) (car x))
(define (imag x) (cdr x))
(define (complex-sqrt x)
  (define (first a b) (sqrt (/ (+ a
                                  (sqrt (+
                                         (* a a)
                                         (* b b))))
                               2)))
  (define (second a b) (sqrt (/ (+ (* -1 a)
                                   (sqrt (+
                                          (* a a)
                                          (* b b))))
                                2)))
  (cons (first  (real x) (imag x))
        (second (real x) (imag x))))

(display (complex-sqrt (cons 1 2)))
(newline)
致:

这是内置的“第二个”函数,而不是您的第二个函数。它相当于car cdr lst或列表的第二项

然后它就起作用了:

(define (imag x) (second x))
cdr x是一个列表,而第二个x是一个项目

最初的错误充分说明了这一点:

(complex-sqrt '(2 3))
; output:  '(1.6741492280355401 . 0.895977476129838)
应该缩进,因为它是复杂sqrt函数的一部分。提示:要轻松地对DrRacket中的整个代码应用适当的缩进,请选择All并按tab键


真正的y应该是imag x

您使用的是lang racket还是一种学生语言?我使用的是R5RS语言。2 3等于cons 2 cons 3 null。我想你的意思是使用cons 2 3作为输入。在你当前的代码中,“y”是未绑定的。我认为“real y”应该是“imag x”你使用的是lang racket还是学生语言?我使用的是R5RS语言。2 3等于cons 2 cons 3 null。我想你的意思是使用cons 2 3作为输入。在你当前的代码中,“y”是未绑定的。我认为“真正的y”应该是“imag x”。从问题的最后一句判断,OP似乎试图通过列表12,而不是一对。听起来很可能。你还记得这是否是一个SICP练习吗?@sara那么你需要更改imag的定义来定义imag x car cdr x。从问题的最后一句判断,OP似乎试图通过列表12而不是一对。听起来很可能。你还记得这是否是一个SICP练习吗?@sara那么你需要更改imag的定义,以定义imag x car cdr x。在词汇范围内隐藏是可以的,但有风险。只有当报告的功能仍然与报告相同时,才可以在报告中重新定义globals。因此,OPs second在全局名称空间中是不合适的,因为它不支持对。在词法范围中隐藏是可以的,但有风险。只有当报告的功能仍然与报告相同时,才可以在报告中重新定义globals。因此,OPs second在全局名称空间中是不合适的,因为它不支持对。