Racket中hash-keys契约违反问题求助:关联列表与哈希表不匹配
解决hash-keys契约违反错误
错误原因
mk-initial-pagerank函数返回的是关联列表(alist),格式为((n2 . 1/5) (n0 . 1/5) ...),但print-hash函数使用了hash-keys、hash-ref这类仅适用于哈希表的操作,因此触发契约违反错误。
两种解决方案
方案1:修改mk-initial-pagerank返回哈希表
将原函数的关联列表构建逻辑改为哈希表生成,这样print-hash可以直接使用:
(define (mk-initial-pagerank graph) (let* ((pages (remove-duplicates (apply append graph))) (num-pages (length pages))) ; 使用for/hash生成哈希表,键为页面符号,值为初始PageRank值 (for/hash ([page pages]) (values page (/ 1 num-pages)))))
调用方式不变,(print-hash (mk-initial-pagerank g0))即可输出符合预期的结果。
方案2:修改输出函数处理关联列表
保留原mk-initial-pagerank不变,修改输出函数以适配关联列表:
(define (print-alist alst) ; 先按符号排序关联列表的条目,再逐个输出 (for ([entry (sort alst (lambda (a b) (symbol<? (car a) (car b))))]) (pretty-print `(,(car entry) ,(cdr entry))))) ; 调用修改后的输出函数 (print-alist (mk-initial-pagerank g0))
验证结果
两种方案执行后,都会输出:
'(n0 1/5) '(n1 1/5) '(n2 1/5) '(n3 1/5) '(n4 1/5)
内容的提问来源于stack exchange,提问作者poojan desai
相关产品推荐
相关产品推荐

