【发布时间】:2021-06-10 00:50:51
【问题描述】:
这个程序:
(struct pt (x y))
(define (distance p1 p2)
(sqrt (+ (sqr (- (pt-x p2) (pt-x p1)))
(sqr (- (pt-y p2) (pt-y p1))))))
(distance (pt 0 0) (pt 3.1415 2.7172))
工作正常。如果添加一行:
(struct pt2 (x y))
然后
(distance (pt 0 0) (pt2 3.1415 2.7172))
有错误
pt-x: contract violation
expected: pt?
given: #<pt2>
我认为是因为函数距离使用“pt-x”和“pt-y”来检查结构的类型。在其他静态类型语言中,类型声明和类型检查将发生在函数的头部,如下所示:
(define (distance p1:pt p2:pt)
所以作为球拍,如果有......可能在“(定义(距离p1 p2)”之后有100行代码,并且需要1分钟,那么行“(sqrt(+(sqr(-(pt-x p2) (pt-x p1)))",发现类型错误,会浪费1分钟?
谢谢!
【问题讨论】:
-
所以如果我使用类型化的球拍,我可以在函数的第一行做静态类型检查吗?