2016-05-03 58 views
0

我的任務是計算我的列表(列表清單)中的長度爲3的列表的數量。 我想我正確地構建了一切,但是當我想將第一個列表發送到遞歸函數時,它失敗了,因爲我的列表的類型爲Any,而且我找不到使列表成爲列表的方式。定義在球拍中接受列表清單的函數

#lang pl 

(: count-3lists : (Listof Any) -> Number) 
(define (count-3lists l) 
    (cond 
    [(null? l) 0] 
    [else (+ (count-3lists-helper (first l)) (count-3lists (rest l)))])) 

(: count-3lists-helper : (Listof Any) -> Number) 
(define (count-3lists-helper l) 
    (cond [(= (length l) 3) 1] 
     [else 0])) 

(: length : (Listof Any) -> Number) 
(define (length l) 
    (cond 
     [(null? l) 0] 
     [else (add1 (length (rest l)))])) 

我得到的錯誤是:

. Type Checker: Polymorphic function `first' could not be applied to 
arguments: 
Types: (Pairof a (Listof b)) -> (a : ((! False @ (car) (0 0)) | (False @ (car) (0 0))) : (car (0 0))) 
     (Listof a) -> a 
Arguments: (Pairof Any (Listof Any)) 
Expected result: (Listof Any) 
in: (first l) 
+0

錯誤發生是因爲在count-3lists的定義中,表達式'(first l)'具有類型'Any',但它在上下文中,因爲「count-3lists-helper」的參數,期望有一個「(Listof Any)」。但是,這個問題並不在你的'長度'功能中。你有沒有試過把你的'長度'函數放在一個單獨的文件中? –

回答

2

好像你希望你的count-3lists功能採取的列表作爲其輸入的列表。現在你有(Listof Any)

你想要表達的東西像(ListofList),但內部列表必須是一個東西的列表,所以你可以寫爲(Listof (Listof Any))

那麼你的代碼的第一部分變成這樣:

(: count-3lists : (Listof (Listof Any)) -> Number) 
(define (count-3lists l) 
    (cond 
    [(null? l) 0] 
    [else (+ (count-3lists-helper (first l)) (count-3lists (rest l)))])) 

之後,你的代碼的其餘部分工作。事實證明,你的length功能很好。 (所以你應該重新命名你的問題。)