我正在尝试构建一个获取数字的简单函数,检查数字是否更多为零并返回数字的平方根:
#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;数)
为什么我会收到该错误,如何解决?
答案 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
或其他内容。