在Racket中键入检查参数是一种好习惯吗?

时间:2014-03-05 13:06:50

标签: types scheme racket

我是球拍的新手,我需要作为编写一些程序的作业。检查参数的类型是一种好习惯吗?例如,更好的是:

(define (add x y)
  (+ x y)
)

或者

(define (add x y)
  (unless (number? x)(raise exception))
  (unless (number? y)(raise exception))
  (+ x y)
)

我可以考虑:类型检查会使异常更早被抛出,并且更容易找到。但它使代码更复杂,更不易读。

3 个答案:

答案 0 :(得分:7)

专业球拍代码倾向于使用contracts来实现此目的,通常用于模块的导出。合同既可以作为文档,也可以保证您的函数被调用正确的输入并产生正确的输出。

他们也将责备"违反合同条款的代码。

对于您的示例,您可以在模块中编写如下所示的合同:

(provide (contract-out [add (-> number? number? number?)]))

然后当其他模块试图错误地使用add函数时,它们将受到指责。像这样单独编写合同是一种很好的做法,因为它将实现和代码规范分开。


尽管如此,除非您正在学习软件工程课程并编写大型程序,否则这可能只是让人分心。因此,对于您的任务,请不要打扰。

答案 1 :(得分:2)

如果您正在编写一个可供其他人使用的可重复使用模块,那么检查参数并确保类型正确是有意义的,但只有在检查尚未执行的情况下 - 在您的例如,没有必要验证参数是否是数字,如果它们不是由于合同违规而发生的错误,换句话说:在添加过程中类型检查已经存在。

Scheme使用动态类型变量,在正常情况下,你的代码不应该执行这样的检查,只需要编写程序的逻辑并担心以后的类型检查(如果有的话)。

答案 2 :(得分:1)

添加程序已经进行了类型检查。一个更重要的问题是你想如何处理异常。花一些时间调查with-exception-handler