2016-11-16 75 views
0

我寫了下面的功能find-index在列表中搜索:現在需要幫助的球拍

(: finind : (Listof Integer) Integer -> (Option Integer)) 
;; helper function for find-index 
(define (finind a b) 
    (let loop ((a a) (c 0)) 
     (cond 
     ((empty? a) 'None) 
     ((equal? (first a) b) (Some c)) 
     (else (loop (rest a) (add1 c)))))) 

(: find-index : (Integer -> Boolean) (Listof Integer) 
       -> (Option (Pr (Option Integer) Integer))) 
;; return the first item to pass the test, if there is one, 
;; along with its (0-based) index 
(define (find-index f x) 
    (match x 
     ('() 'None) 
     ((cons hd '()) 
     (if (f hd) (Some (Pr (finind x hd) hd)) 'None)) 
     ((cons hd tl) 
     (if (f hd) (Some (Pr (finind x hd) hd)) 
        (find-index f tl))))) 

finind作品完美自身,但是當我find-index使用它,它只是還給(Some 0)

(finind (list 45 41 9) 9)的結果是(Some 2)

但是,(find-index (lambda ([t : Integer]) (< t 10)) (list 45 41 9))的結果是(Some (Pr (Some 0) 9)),即使它應該是(Some (Pr (Some 2) 9))

所以我知道這可能是因爲我有(finind x hd)來顯示我的索引,因爲它的hd它不會改變。但是,我如何解決這個問題?我一直在努力,但徒勞無功。有人可以幫忙嗎?謝謝!

+0

在上一個cond術語謂詞是假的時候你是遞歸到'find-index',你不會以任何方式傳遞索引偏移量,所以它不知道這是你第三次做這件事。也許換一個索引並使用它可以解決您的問題。 – Sylwester

+0

我不明白。你能給個例子嗎? – testomg

+1

你沒有把''(45 41 9)'傳遞給'finind',你傳遞的第一個尾部滿足'f',即'(9)'。 – molbdnilo

回答

1

由於hdx的頭,(finind x hd)將始終爲零。

目前還不清楚Pr類型的用途,但從評論它聽起來像你想要一個可選的對。
可以使用蓄能器參數的景氣指數:

(: find-index : (Integer -> Boolean) (Listof Integer) -> (Option (Pair Integer Integer))) 
(define (find-index pred? ls) 
    (: find-help : (Listof Integer) Integer -> (Option (Pair Integer Integer))) 
    (define (find-help ls i) 
    (cond [(null? ls) 'None] 
      [(pred? (car ls)) (Some (cons i (car ls)))] 
      [else (find-help (cdr ls) (+ i 1))])) 
    (find-help ls 0)) 

(我做我自己的Option類型;您可能會有所不同。)
試運行:

> (find-index (lambda ([t : Integer]) (< t 10)) (list 45 41 9)) 
- : (U 'None (Some (Pairof Integer Integer))) 
(Some '(2 . 9)) 
> (find-index (lambda ([t : Integer]) (< t 10)) (list 45 41 49)) 
- : (U 'None (Some (Pairof Integer Integer))) 
'None 
> (find-index (lambda ([t : Integer]) (< t 10)) (list 9 41 9)) 
- : (U 'None (Some (Pairof Integer Integer))) 
(Some '(0 . 9)) 
1

可以使用functional-lib包,以方便你

(require data/maybe)  

(define (find f xs) 
    (cond ((empty? xs) nothing) 
     ((f (car xs)) (just (car xs))) 
     (else (find f (cdr xs))))) 

(define (find-index f xs (i 0)) 
    (cond ((empty? xs) nothing) 
     ((f (car xs)) (just i)) 
     (else (find-index f (cdr xs) (add1 i))))) 

(find (λ (x) (< x 10)) '(10 11 3 2 1))  ;; (just 3) 
(find-index (λ (x) (< x 10)) '(10 11 3 2 1)) ;; (just 2) 

(find (λ (x) (< x 0)) '(10 11 3 2 1))  ;; nothing 
(find-index (λ (x) (< x 0)) '(10 11 3 2 1)) ;; nothing 
+0

這些函數是否應該添加到'functional-lib'的某處? –

+0

@AlexisKing我很榮幸能夠這麼認爲。我以前從來沒有爲球拍包做過貢獻,所以我可能不是最有效的人選。你能想出其他方法來使程序更好嗎? – naomik

+0

從某種意義上講,它們對於'collections-lib'來說是最有意義的,但不幸的是,該庫早於'functional-lib',並且不在其API中使用'data/maybe'。我想知道是否可以稍微優雅地添加一個替代API。 –