sqrt函数在球拍中出错

时间:2016-05-13 14:43:36

标签: racket

我正在尝试构建一个获取数字的简单函数,检查数字是否更多为零并返回数字的平方根:

#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:Number    - &GT;数)

为什么我会收到该错误,如何解决?

2 个答案:

答案 0 :(得分: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是一个程序,并且像所有其他程序一样,要应用它,你必须用括号及其参数围绕它。

答案 1 :(得分:1)

您收到的错误消息告诉您在:类型声明中的标识符后面有太多类型。现在在球拍中,sqrtt:计为标识符。您可能想要的是sqrtt :,其间有空格。

(: sqrtt : Number -> Number)

区别在于(: id : In ... -> Out)形式的类型声明是专门处理的,但(: id In ... -> Out)形式的类型声明不是。 sqrtt:计为id

还有一个问题是奥斯卡·洛佩兹指出,你在error电话周围丢失了一些问题。每当你在球拍中调用一个函数,包括error时,你需要将函数调用包装在parens中。

此外,(null? root)子句无用,因为root的类型为数字,null?将始终为数字返回false。

另外一点,取决于pl语言的作用,如果之后从<收到类型错误,那是因为<仅对实数进行操作,而是数字类型可以包括复数。因此,您可能需要将类型更改为Real或其他内容。