在Racket的列表中搜索需要帮助

时间:2016-11-16 07:21:59

标签: functional-programming scheme racket typed-racket

我为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它没有改变。但是我怎么绕过那个?我一直在尝试,但徒劳无功。有人可以帮忙吗?谢谢!

2 个答案:

答案 0 :(得分: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 :(得分:1)

您可以使用functional-lib软件包轻松实现这一目标

#ConnectionContextInfo