Scheme 简单型球拍程序不';t型检验
我是一个有类型球拍的初学者,我在玩非常简单的Scheme 简单型球拍程序不';t型检验,scheme,racket,typechecking,typed-racket,Scheme,Racket,Typechecking,Typed Racket,我是一个有类型球拍的初学者,我在玩非常简单的树类型,定义在: 作为练习,我决定编写一个高阶函数来降低树: (: tree-descend : All (A) (Number -> A) (A A -> A) Tree -> A) (define (tree-descend do-leaf do-node tree) (if (leaf? tree) (do-leaf (leaf-val tree)) (do-node (tree-descend do
树
类型,定义在:
作为练习,我决定编写一个高阶函数来降低树:
(: tree-descend : All (A) (Number -> A) (A A -> A) Tree -> A)
(define (tree-descend do-leaf do-node tree)
(if (leaf? tree)
(do-leaf (leaf-val tree))
(do-node (tree-descend do-leaf do-node (node-left tree))
(tree-descend do-leaf do-node (node-right tree)))))
这种类型的检查很好。但是,当我尝试使用它重新定义在所有叶子上求和的树和
函数时,我得到了一条令人惊讶且详细的错误消息:
(: tree-sum : Tree -> Number)
(define (tree-sum t)
(tree-descend identity + t))
错误消息如下所示
现在,在我未经训练的眼中,它看起来应该工作得很好,因为显然多态类型
A
应该是Number
,然后一切都工作了。显然,由于某些原因,这种语言与我的观点不一致,但我不确定这是什么原因。不幸的是,当您将它们应用于多态参数(如identity
)时,类型化Racket无法推断出多态函数(如tree-down
)的正确实例化。如果将标识
替换为(inst identity Number)
,则程序工作正常。对于树和
,您似乎有一个额外的类型参数,我认为您是从早期版本的代码中留下的。感谢您捕捉到这一点;固定的。
(: tree-sum : Tree -> Number)
(define (tree-sum t)
(tree-descend identity + t))
Type Checker: Polymorphic function `tree-descend' could not be applied to arguments:
Argument 1:
Expected: (Number -> A)
Given: (All (a) (a -> a))
Argument 2:
Expected: (A A -> A)
Given: (case-> (-> Zero) (Zero Zero -> Zero) (One Zero -> One)
(Zero One -> One) (Positive-Byte Zero -> Positive-Byte)
[...lots of ways of combining subtypes of Number...]
(Index Positive-Index Index -> Positive-Fixnum)
(Index Index Positive-Index -> in: (tree-descend identity + t)