我正在尝试将项目从racket转换为类型球拍,因为测试引擎,我遇到了使用代码的错误。
我已经将它缩减为我可以创建的最小的代码片段来重现问题:
#lang typed/racket
; provides check-expect and others for testing
(require typed/test-engine/racket-tests)
(: bar (-> Positive-Integer Integer))
(check-random (bar 6) (random 6))
(define (bar x)
(random x))
(test)
错误是:
. Type Checker: type mismatch
expected: Pseudo-Random-Generator
given: Any in: (check-random (bar 6) (random 6))
. Type Checker: type mismatch
expected: Positive-Integer
given: Any in: (check-random (bar 6) (random 6))
. Type Checker: Summary: 3 errors encountered in:
(check-random (bar 6) (random 6))
(check-random (bar 6) (random 6))
(check-random (bar 6) (random 6))
有没有人对如何解决此问题有任何建议?我真的希望能够尽可能使用类型检查功能。
由于
答案 0 :(得分:2)
当然,我可以提供帮助,但这很大程度上取决于你想要什么,以及你要去哪里。
简短概述:Racket有多个测试框架。您正在使用为教学语言构建的那个。它有几个不错的功能,但一般来说rackunit是其他人使用的测试框架。
在我看来,教学语言测试框架的打字版本不包括对随机检查的支持。我会在邮件列表上查看这个。这会引导你走向rackunit。
不幸的是,rackunit不包括“check-random”表单。幸运的是,实施起来并不难。这是我的实现,附在你的代码上。
#lang typed/racket
; provides check-expect and others for testing
(require typed/rackunit)
;; create a new prng, set the seed to the given number, run the thunk.
(: run-with-seed (All (T) ((-> T) Positive-Integer -> T)))
(define (run-with-seed thunk seed)
(parameterize ([current-pseudo-random-generator
(make-pseudo-random-generator)])
(random-seed seed)
(thunk)))
;; run a check-equal where both sides get the same PRNG seed
(define-syntax check-random-equal?
(syntax-rules ()
[(_ a b) (let ([seed (add1 (random (sub1 (expt 2 31))))])
(check-equal? (run-with-seed (λ () a) seed)
(run-with-seed (λ () b) seed)))]))
(: bar (-> Positive-Integer Integer))
(define (bar x)
(random x))
(check-random-equal? (bar 6)
(random 6))
我应该告诉你两个测试框架之间的几个重要区别。