我如何在 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 类型之一来捕捉这个想法。
(也有细化类型,这里不需要)
我正在编写一个只接受正数的函数,我想确保它在模块内部和其他地方都能正确使用。
我想写
#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 类型之一来捕捉这个想法。
(也有细化类型,这里不需要)