如何在Typed Racket中使用define / contract(或等效的东西)?

时间:2017-10-29 14:59:31

标签: racket contract 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的注释(它会引发语法错误)。

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

此外,我不应该这样做是否有充分理由?混淆合同和类型是否气馁?

注意:我想我真正想要的是依赖打字,但是在Racket中没有。

1 个答案:

答案 0 :(得分:2)

这里的简单答案:使用类型"非负实数",或其他类似的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

(还有精炼类型,但你不需要它们。)