我为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 :(得分:1)
由于hd
是x
的头部,(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