我正在尝试将项目从球拍转换为类型球拍,但由于测试引擎的原因,我遇到了工作代码错误。
我已将其缩减为我可以创建的重现问题的最小代码片段:
#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))
有人对如何解决这个问题有任何建议吗?如果可能的话,我真的希望能够使用类型检查功能。
谢谢
当然,我可以提供帮助,但这在很大程度上取决于您到底想要什么,以及您要做什么。
简要概述:Racket 有多个测试框架。您正在使用专为教学语言构建的语言。它有几个不错的功能,但一般来说,rackunit 是其他人使用的测试框架。
在我看来,教学语言测试框架的打字版本不包括对随机检查的支持。我会在邮件列表上检查这一点。这将引导您走向机架单元。
不幸的是,机架单元不包括“检查随机”形式。幸运的是,实施起来并不难。这是我的实现,附加到您的代码中。
#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))
我可能应该告诉您这两个测试框架之间的几个重要区别。