随机检查时键入的球拍错误

问题描述 投票:0回答:1

我正在尝试将项目从球拍转换为类型球拍,但由于测试引擎的原因,我遇到了工作代码错误。

我已将其缩减为我可以创建的重现问题的最小代码片段:

#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))

有人对如何解决这个问题有任何建议吗?如果可能的话,我真的希望能够使用类型检查功能。

谢谢

unit-testing racket typed-racket
1个回答
2
投票

当然,我可以提供帮助,但这在很大程度上取决于您到底想要什么,以及您要做什么。

简要概述: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))            

我可能应该告诉您这两个测试框架之间的几个重要区别。

  • 最后不需要调用“(test)”;测试与其余代码交错运行。
  • 由于测试与代码交错,因此它们必须出现在运行测试所需的所有定义下方。
  • 测试成功时不会打印任何内容。
© www.soinside.com 2019 - 2024. All rights reserved.