2016-05-13 1 views
0

Я пытаюсь построить простую функцию, которая получает номер, проверяет, если число больше нуля и возвращает квадратный корень из числа:функция SQRT получает ошибку в ракетке

#lang pl 03 

    (: sqrtt: Number -> Number) 

    (define (sqrtt root) 
     (cond [(null? root) error "no number ~s"] 
      [(< root 0) error "`sqrt' requires a non-negative input ~s"] 
      [else (sqrt root)])) 

, но результат Я получаю, когда я пытаюсь скомпилировать функцию является:

объявления типа: слишком много типов после идентификатора в: (: sqrtt: Номер -> Номер)

Почему я получаю эту ошибку и как ее исправить?

ответ

2

Попробуйте это:

(define (sqrtt root) 
    (cond [(null? root) (error "no number ~s")] 
     [(< root 0) (error "`sqrt' requires a non-negative input ~s")] 
     [else (sqrt root)])) 

Вы просто забыли () вокруг error. Помните, что error - это процедура, и, как и все другие процедуры, чтобы применить ее, вы должны окружить ее круглыми скобками вместе со своими аргументами.

+0

Хотя верно, что он забыл парсеры вокруг «ошибки», что, безусловно, не является причиной его проблемы. @ Ответ Алекс является причиной проблемы. (Хотя я не очень хорошо знаком с языком 'pl', так что это также может быть проблемой.) –

1

Сообщение об ошибке, которое вы получаете, сообщает вам, что у вас слишком много типов после идентификатора в объявлении типа :. Теперь в ракетке sqrtt: считается идентификатором. То, что вы, вероятно, имели в виду, - sqrtt :, с промежутком между ними.

(: sqrtt : Number -> Number) 

Разница заключается в том, что декларации типа вида (: id : In ... -> Out) рассматриваются специально, но те формы (: id In ... -> Out) нет. И sqrtt: считается id.

Существует также проблема, о которой говорил Оскар Лопес, где вам не хватает парсенов вокруг звонков error. Всякий раз, когда вы вызываете функцию в racket, включая error, вам нужно обернуть вызов функции в parens.

Кроме того, статья (null? root) бесполезна, так как root имеет тип Number и null? всегда будет возвращать false для чисел.

И еще одна вещь, в зависимости от того, что делает pl язык, если вы получаете сообщение об ошибке типа от < потом, это потому, что < оперирует только действительные числа, но тип Number может включать в себя комплексные числа. Поэтому вам, возможно, придется изменить тип на Real или что-то в этом роде.

Смежные вопросы