gpt4 book ai didi

scheme - Simple Typed Racket 程序不进行类型检查

转载 作者:行者123 更新时间:2023-12-01 11:39:22 24 4
gpt4 key购买 nike

我是 Typed Racket 的 rank 初学者,我正在玩弄 Beginner's Guide 中定义的非常简单的 Tree 类型:

#lang typed/racket
(define-type Tree (U leaf node))
(struct: leaf ([val : Number]))
(struct: node ([left : Tree] [right : Tree]))

作为练习,我决定编写一个高阶函数来下降树:

(: 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-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)

现在,在我未经训练的情况下,这看起来应该工作得很好,因为显然多态类型 A 应该只是 Number 然后一切正常。显然,出于某种原因,该语言不同意我的看法,但我不确定是什么原因。

最佳答案

不幸的是,当您将多态函数应用于诸如 identity 之类的多态参数时,Typed Racket 无法推断出诸如 tree-descend 之类的多态函数的正确实例化。如果将 identity 替换为 (inst identity Number),则程序可以正常运行。

关于scheme - Simple Typed Racket 程序不进行类型检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23046164/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com