2014-03-12 77 views
0
> (map (λ: ([x : (Pairof Symbol Number)]) (cdr x)) (list (cons (quote a) 0.3) (cons (quote b) 0.2) (cons (quote c) 0.5))) 
- : (Listof Number) [generalized from (Pairof Number (Listof Number))] 
'(0.3 0.2 0.5) 
> (sum '(0.3 0.2 0.5)) 
- : Real 
1.0 
> (sum (map (λ: ([x : (Pairof Symbol Number)]) (cdr x)) (list (cons (quote a) 0.3) (cons (quote b) 0.2) (cons (quote c) 0.5)))) 
. Type Checker: Polymorphic function map could not be applied to arguments: 
Types: (a -> c) (Pairof a (Listof a)) -> (Pairof c (Listof c)) 
    (a b ... b -> c) (Listof a) (Listof b) ... b -> (Listof c) 
Arguments: ((Pairof Symbol Number) -> Number : ((! False @ (cdr) 0) | (False @ (cdr) 0)) (cdr 0)) (List (Pairof 'a Positive-Flonum) (Pairof 'b Positive-Flonum) (Pairof 'c Positive-Flonum)) 
Expected result: (Listof Real) 
in: (map (λ: ((x : (Pairof Symbol Number))) (cdr x)) (list (cons (quote a) 0.3) (cons (quote b) 0.2) (cons (quote c) 0.5))) 

爲什麼第一和第二的表達,> (map ...> sum ...工作,因爲我想到,卻試圖把它們混合起來拋出一個類型的錯誤?類型化的球拍多態函數不能應用於

> sum 
- : ((Listof Real) -> Real) 
#<procedure:sum> 

我不明白爲什麼map返回一個(Listof Number) [generalized from (Pairof Number (Listof Number))]而不僅僅是(Listof Number)的基礎上,我以爲map一樣。

+0

你應該發佈'sum'的定義 –

+0

只是想指出我沒有在這裏定義'sum'。 – Ben

回答

-1

看起來像問題是sum預計(Listof Real)map返回(Listof Number)。該解決方案是使用(apply + (map ...))代替(sum (map ...))

3

的問題是下列之一:

  1. 您聲明參數x是一個Number
  2. 您聲明sumReal小號
  3. 工作

(Typed)Racket文檔中的某處介紹了類型樹。您的代碼存在的問題是RealNumber的子類型。所以,當你的map產生一個Number s的列表時,sum函數將只接受一個更具體的類型(幸好)會產生一個錯誤。

您可以通過讓和修復它處理任何類型的Numbers(假設你使用+,應該是安全的時候),也明確聲明x是一個Real(這可能並不總是正確的,但在這個有限的例子工作正常)。

+0

1. s/he將'x'定義爲'Pairof ...',然而'λ'返回'Number'。 2.他/他沒有定義'sum'。 'sum'來自'math/base'。 – weakish

相關問題