2016-05-13 106 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什麼的。