【发布时间】:2013-05-10 12:49:13
【问题描述】:
我定义了以下内容:
(struct type (parent dirty) #:mutable #:transparent)
(define types (make-hash))
(define (add-key predicate parent)
(begin
(hash-ref! types parent (type empty #t)) ;;if the parent doesn't exist, is created with no parent.
(let([node (hash-ref types predicate #f)])
(if(or (boolean? node) ;;the node is not on the list
(not(equal? (type-parent node) parent))) ;;the node has a different parent
(hash-set! types predicate (type parent #t))
(printf "nothing to do\n")
))))
(define (ancestor? predicate1 predicate2)
(let ([node (hash-ref types predicate2 #f)])
(cond [(false? node)(error "following predicate is not in types: " predicate2)]
[(empty? (type-parent node)) #f]
[(equal? (type-parent node) predicate1) #t]
[else (ancestor? predicate1 (type-parent node))])))
它似乎工作得很好,我可以做这样的事情:
> (ancestor? integer? even?)
#t
> (ancestor? list? even?)
#f
> (ancestor? integer? odd?)
#t
>
我似乎只对sort 和(sort '(integer? odd? number? list? even?) ancestor?) 有问题
抛出以下错误:following predicate is not in types: integer?
当然,这是在我的实现中定义的。问题是我确信键值对存在,我可以操纵它,我可以手动运行ancestor 的每一行代码......我真的很困惑可能导致这个......任何想法?
【问题讨论】:
-
注意:如果您在查询之前对树进行线性预处理,那么有一个非常可爱的算法可以让您在恒定时间内进行查询。见:stackoverflow.com/questions/10310809/…
-
仔细阅读你的问题:当你说
(sort '(integer? odd? number? list? even?))时,你真的是指(sort (list integer? odd? number? list? even?))吗?
标签: sorting hashmap racket predicate