如何在键入的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
,vanilladefine/contract
也不理解类型化的Racket的注释(它抛出了一个语法错误)
我能解决这个问题吗?我是否可以使用裸合同
将合同附加到激励对数
上,就像定义/合同
那样
此外,有什么理由我不应该这样做吗?是否不鼓励混合合同和类型
注意:我想我在这里真正想要的是依赖类型,但这在Racket中是不可用的。这里的简单答案是:使用类型“Nonnegative Real”,或者使用其他类似的TR类型来捕捉这个想法
(这里也有细化类型,但您不需要它们。)哇,我在参考资料中遗漏了这些,谢谢!然而,问题仍然在于一般情况,这取决于你的“一般”情况有多普遍。您可以使用细化类型来捕获一些类似这样的约束,并且您当然可以定义自己的简单平面契约宏来执行此检查;合同中最有趣/最具挑战性的部分发生在函数类型上。什么是“细化类型”?我在键入的Racket文档中搜索了该术语,但没有找到任何内容。对于不存在特定类型的一般情况,可能存在这种可能性。@ssdecontrol这是6.10中的“实验性功能”。以下是文档的URL: