我正在编写一个只接受正数的函数,我想确保它在模块内部和其他地方都正确使用。
我想写
#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的注释(它会引发语法错误)。
我可以以某种方式解决这个问题吗?我可以使用裸contract
将合同附加到excited-logarithm
define/contract
的方式吗?
此外,我不应该这样做是否有充分理由?混淆合同和类型是否气馁?
注意:我想我真正想要的是依赖打字,但是在Racket中没有。
答案 0 :(得分:2)
这里的简单答案:使用类型"非负实数",或其他类似的TR类型之一来捕捉这个想法。
(还有精炼类型,但你不需要它们。)