Racket 如何使用代数球拍来分解let绑定中的值
我试图在这里使用Racket而不是OCaml来完成关于分隔连续体的教程,但是在尝试使用Racket的代数数据类型来表达我的程序时遇到了障碍,因此我的示例代码与教程非常接近 具体来说,我无法理解如何使用Racket 如何使用代数球拍来分解let绑定中的值,racket,algebraic-data-types,Racket,Algebraic Data Types,我试图在这里使用Racket而不是OCaml来完成关于分隔连续体的教程,但是在尝试使用Racket的代数数据类型来表达我的程序时遇到了障碍,因此我的示例代码与教程非常接近 具体来说,我无法理解如何使用let表单绑定实例的字段。在这个简单的示例中,我定义了一个树和类型,其中有两个乘积类型Empty和节点,其中每个节点将包含一个左分支、一个值和一个右分支 #朗格代数/球拍/球座 (需要代数/函数) (数据树(空节点)) (定义树1(节点(节点为空1)2(节点为空3))) (let([(节点左值右)树
let
表单绑定实例的字段。在这个简单的示例中,我定义了一个树
和类型,其中有两个乘积类型Empty
和节点
,其中每个节点将包含一个左分支、一个值和一个右分支
#朗格代数/球拍/球座
(需要代数/函数)
(数据树(空节点))
(定义树1(节点(节点为空1)2(节点为空3)))
(let([(节点左值右)树1])值)
我所期望的是,这个表达式的计算结果将是2
,因为value
绑定到根节点的value字段,但是它会失败,因为:(node left value right)中的let:bad语法(不是标识符)。然而,如果我理解正确,这应该是可能的
例如,我可以定义walk
函数递归访问树中的每个节点,并使用模式匹配绑定树的左右两侧,这非常有效
(定义行走(功能
[空`完成]
[(节点左值右)
(向左走)
(println值)
(向右走)
我似乎无法在let
的上下文中这样做。我的语法错了吗?我是否使用了正确版本的let
?这是你能做到的吗?它看起来像是代数/racket/base
没有提供let
的语法,所以它只是从vanillaracket/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
,效果很好。谢谢