- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正处于用 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/
我正处于用 Haskell 编写类似 C 语言的解析器的开始阶段。我已经掌握了 AST 数据类型,在深入研究解析器方面之前,我正在通过在 AST 本身上编写一些简单的查询来使用它。 我的 AST 围绕
我正在尝试回答 this stackoverflow question, using uniplate as I suggested ,但 the only solution I've come up
我有the following code遍历an AST使用cosmosOf和 uniplate寻找某种类型的节点。对于它找到的任何内容,它都会在记录中设置一个 Bool 标志,该标志在 the le
我是一名优秀的程序员,十分优秀!