计划合同违规错误

时间:2016-10-13 17:08:46

标签: compiler-errors scheme racket

(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))

我一直收到一条错误,上面写着" *合同违规:预期数量"当它试图评估(第一个b)和(第二个b)。我不确定这些信息是否相关,但输入将始终是2个数字的列表。

2 个答案:

答案 0 :(得分:0)

你还没有包含一个完整的例子,所以很难说出了什么问题。 也许您使用错误类型的参数调用complex-sqrt

这对我有用:

#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)

答案 1 :(得分:0)

变化:

(define (imag x) (cdr x))

到:

(define (imag x) (second x))

(这是内置的第二个功能,而不是你的第二个功能。它等同于(car (cdr lst))或第二个列表项。)

然后它起作用:

(complex-sqrt '(2 3))
; output:  '(1.6741492280355401 . 0.895977476129838)

(cdr x)是一个列表,而(second x)是一个项目。

原始错误完全提到了这一点:

*: contract violation
  expected: number?
  given: '(3)                     ; <<<<<< NOTE
  argument position: 1st
  other arguments...:

&#39; *&#39;需要项目而不是列表功能。

另外,你不应该先使用&#39;和第二个&#39;作为您自己的函数名称,因为它们是在函数中构建的(用于获取任何列表的第一个和第二个元素)。见here

你职能中的第二句话:

(cons (first (real x) (imag x)) (second (real x) (real y))))

应该缩进,因为它是complex-sqrt函数的一部分。 (提示:轻松地将适当的缩进应用于DrRacket中的整个代码,选择全部并按Tab键。)

(real y)应为(imag x)