【发布时间】:2021-07-11 20:53:27
【问题描述】:
我正在尝试生成一个类型化的 Racket 过程,该过程对于某些类型 A,采用 Tree,以及从两个 As 到 A 的函数,另一个类型为 A 的参数,并返回一个A 类型的值。我对(All) 语法不是很熟悉,但我尝试过使用它。不幸的是,我的代码在构建时产生了以下错误消息:
Type Checker: Polymorphic function `foldr' could not be applied to arguments:
Types: (-> a b b) b (Listof a) -> b
(-> a b c c) c (Listof a) (Listof b) -> c
(-> a b c d d) d (Listof a) (Listof b) (Listof c) -> d
Arguments: (-> A A A) A (Listof Any)
Expected result: A
我的代码:
(: fold : (All (A) (Instance Tree) (A A -> A) A -> A))
(define (fold tree f base)
(foldr
f
base
(cons
(value tree)
(map
(lambda
([tree : (Instance Tree)])
(fold tree f base)
)
(children tree)
)
)
)
)
我试图简化函数直到它开始工作,这就是它开始工作的地方:
(: fold : (All (A) (Instance Tree) (A A -> A) A -> A))
(define (fold tree f base)
(foldr f base (list base))
)
我认为正在发生的事情是类型检查器不知道(value tree) 也是A 类型。有什么办法可以让(Cast) 成为A 类型?如果没有,我将如何实现它?
【问题讨论】:
-
您需要在您的问题中包含“树”类型,它没有内置在 Typed Racket 中。更一般地说,我想知道您是否真的想使用类和对象;这可能会给这个问题带来巨大的复杂性。 (请原谅我假设这是家庭作业,但是)如果问题陈述需要类或提供此代码,那么当然,您会坚持下去,但如果不是,您是否考虑过只使用结构?
标签: tree racket fold parametric-polymorphism typed-racket