2016-05-13 66 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

虽然他错误地忘记了'错误'的遗物,但这绝对不是他的问题的原因。 @ Alex的回答是问题的原因。 (虽然我对'pl'语言不太熟悉,所以也可能是问题。) –

1

您收到的错误消息告诉您在:类型声明中的标识符后面有太多类型。现在在球拍中,sqrtt:被视为一个标识符。你可能的意思是sqrtt :,两者之间有一个空格。

(: sqrtt : Number -> Number) 

所不同的是形式(: id : In ... -> Out)的该类型的声明被特殊处理,但这些形式(: id In ... -> Out)的则不是。并且sqrtt:计为id

还有问题奥斯卡洛佩兹指出,你在哪里丢失error电话周围的parens。无论何时在球拍中调用一个函数,包括error,都需要将函数调用包装在parens中。

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

而另一件事,这取决于pl语言做什么,如果你从<得到一个类型的错误后,那是因为<只有实数操作,但数量类型可以包括复数。所以你可能不得不改变类型Real什么的。