Racket 如何使用代数球拍来分解let绑定中的值

Racket 如何使用代数球拍来分解let绑定中的值,racket,algebraic-data-types,Racket,Algebraic Data Types,我试图在这里使用Racket而不是OCaml来完成关于分隔连续体的教程,但是在尝试使用Racket的代数数据类型来表达我的程序时遇到了障碍,因此我的示例代码与教程非常接近 具体来说,我无法理解如何使用let表单绑定实例的字段。在这个简单的示例中,我定义了一个树和类型,其中有两个乘积类型Empty和节点,其中每个节点将包含一个左分支、一个值和一个右分支 #朗格代数/球拍/球座 (需要代数/函数) (数据树(空节点)) (定义树1(节点(节点为空1)2(节点为空3))) (let([(节点左值右)树

我试图在这里使用Racket而不是OCaml来完成关于分隔连续体的教程,但是在尝试使用Racket的代数数据类型来表达我的程序时遇到了障碍,因此我的示例代码与教程非常接近

具体来说,我无法理解如何使用
let
表单绑定实例的字段。在这个简单的示例中,我定义了一个
和类型,其中有两个乘积类型
Empty
节点
,其中每个节点将包含一个左分支、一个值和一个右分支

#朗格代数/球拍/球座
(需要代数/函数)
(数据树(空节点))
(定义树1(节点(节点为空1)2(节点为空3)))
(let([(节点左值右)树1])值)
我所期望的是,这个表达式的计算结果将是
2
,因为
value
绑定到根节点的value字段,但是它会失败,因为:(node left value right)中的
let:bad语法(不是标识符)。然而,如果我理解正确,这应该是可能的

例如,我可以定义
walk
函数递归访问树中的每个节点,并使用模式匹配绑定树的左右两侧,这非常有效

(定义行走(功能
[空`完成]
[(节点左值右)
(向左走)
(println值)
(向右走)

我似乎无法在
let
的上下文中这样做。我的语法错了吗?我是否使用了正确版本的
let
?这是你能做到的吗?

它看起来像是
代数/racket/base
没有提供
let
的语法,所以它只是从vanilla
racket/base
得到的。不确定这是故意的还是bug,但无论哪种方式,您都可以通过向代码中添加
(需要代数/球拍/基本/表单)
来解决它。给你:

#lang algebraic/racket/base

(require algebraic/racket/base/forms)
(require algebraic/function)

(data Tree (Empty Node))

(define tree1 (Node (Node Empty 1 Empty) 2 (Node Empty 3 Empty)))

(let ([(Node left value right) tree1]) value)

其计算结果为
2

,效果很好。谢谢