gpt4 book ai didi

haskell - 在两级树类型中使用 Uniplate

转载 作者:行者123 更新时间:2023-12-02 18:56:00 24 4
gpt4 key购买 nike

我正处于用 Haskell 编写类似 C 语言的解析器的开始阶段。我已经掌握了 AST 数据类型,在深入研究解析器方面之前,我正在通过在 AST 本身上编写一些简单的查询来使用它。

我的 AST 围绕两种类型:语句(没有值,如 if/else)和表达式(有值,如文字或二元运算) 。所以它看起来像这样(当然,大大简化了):

data Statement
= Return Expession
| If Expression Expression

data Expression
= Literal Int
| Variable String
| Binary Expression Op Expression

假设我想获取表达式中使用的所有变量的名称。使用 uniplate,这很容易:

varsInExpression exp = concat [s | Variable s <- universe exp]

但是如果我想在语句中查找变量列表怎么办?在 Statement 的每个构造函数中,都有一个嵌套的 Expression,我应该对其应用 varsInExpression。所以目前看来,我必须对每个 Statement 构造函数进行模式匹配,这是 uniplate 想要避免的。我是不是对文档理解得不够好,还是这是 uniplate 的限制(或者我做错了?)?

最佳答案

这似乎是双板的一个很好的用例。我依赖于较慢的 Data.Data 方法,但它使此代码变得非常简单。

{-# LANGUAGE DeriveDataTypeable #-}
import Data.Data
import Data.Typeable
import Data.Generics.Uniplate.Data
data Statement
= Return Expression
| If Expression Expression
deriving(Data, Typeable)

data Expression
= Literal Int
| Variable String
| Binary Expression Int Expression
deriving(Data, Typeable)

vars :: Statement -> [String]
vars stmt = [ s | Variable s <- universeBi stmt]

基本上,双板是单板的广义概念,其中目标类型不一定与源相同,例如

biplate :: from -> (Str to, Str to -> from)

关于haskell - 在两级树类型中使用 Uniplate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20171149/

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