我如何在 Typed Racket 中使用 define/contract (或类似的东西)?

How can I use define/contract (or something equivalent) in Typed Racket?

我正在编写一个只接受正数的函数,我想确保它在模块内部和其他地方都能正确使用。

我想写

#lang typed/racket
(require racket/contract)

(: excited-logarithm (-> Number Number))
(define/contract (excited-logarithm ([x : Number]) : Number)
  (-> (>=/c 0) number?)
  (displayln "Hold on to your decimals, we're going in!")
  (log x))

但 Typed Racket 不提供自己的 define/contract,而 vanilla define/contract 不理解 Typed Racket 的注释(它会抛出语法错误)。

我能以某种方式解决这个问题吗?我可以像 define/contract 那样使用 bare contract 将合同附加到 excited-logarithm 吗?

此外,我 不应该 这样做有充分的理由吗?不鼓励混合使用合同和类型吗?

注意:我想我真正想要的是依赖类型,但这在 Racket 中不可用。

这里的简单答案:使用类型 "Nonnegative-Real",或其他类似的 TR 类型之一来捕捉这个想法。

http://docs.racket-lang.org/ts-reference/type-ref.html?q=Positive-Real#%28form._%28%28lib.typed-racket%2Fbase-env%2Fbase-types..rkt%29..Positive-.Real%29%29

(也有细化类型,这里不需要)