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)