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

如何在键入的Racket中使用define/contract(或类似的东西)?,racket,contract,typed-racket,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 y

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

我想写作

#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))
但是类型化的Racket不提供自己的
define/contract
,vanilla
define/contract
也不理解类型化的Racket的注释(它抛出了一个语法错误)

我能解决这个问题吗?我是否可以使用裸
合同
将合同附加到
激励对数
上,就像
定义/合同
那样

此外,有什么理由我不应该这样做吗?是否不鼓励混合合同和类型


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

这里的简单答案是:使用类型“Nonnegative Real”,或者使用其他类似的TR类型来捕捉这个想法


(这里也有细化类型,但您不需要它们。)

哇,我在参考资料中遗漏了这些,谢谢!然而,问题仍然在于一般情况,这取决于你的“一般”情况有多普遍。您可以使用细化类型来捕获一些类似这样的约束,并且您当然可以定义自己的简单平面契约宏来执行此检查;合同中最有趣/最具挑战性的部分发生在函数类型上。什么是“细化类型”?我在键入的Racket文档中搜索了该术语,但没有找到任何内容。对于不存在特定类型的一般情况,可能存在这种可能性。@ssdecontrol这是6.10中的“实验性功能”。以下是文档的URL: