Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 在二级树型中使用Uniplate_Haskell_Parsec - Fatal编程技术网

Haskell 在二级树型中使用Uniplate

Haskell 在二级树型中使用Uniplate,haskell,parsec,Haskell,Parsec,我正处于用Haskell为类C语言编写解析器的开始阶段。我已经搞定了AST数据类型,在深入研究语法分析器之前,我正在通过在AST本身上编写一些简单的查询来处理它 我的AST围绕两种类型展开:语句(没有值,如if/else)和表达式(有值,如文本或二进制操作)。所以它看起来像这样(当然是大大简化了): 数据语句 =返回支出 |If表达式 数据表达 =文字整型 |变量字符串 |二进制表达式 假设我想得到表达式中使用的所有变量的名称。使用uniplate,您可以轻松: varsInExpressio

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

我的AST围绕两种类型展开:语句(没有值,如
if
/
else
)和表达式(有值,如文本或二进制操作)。所以它看起来像这样(当然是大大简化了):

数据语句
=返回支出
|If表达式
数据表达
=文字整型
|变量字符串
|二进制表达式
假设我想得到表达式中使用的所有变量的名称。使用uniplate,您可以轻松:


varsInExpression exp=concat[s | Variable s这似乎是双板的一个很好的用例。我依赖较慢的
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]

哦!那太棒了。我怀疑双板可能与此有关,但没有为
universeBi
生成Haddock文档,谷歌也没有帮我。谢谢你:)。
biplate :: from -> (Str to, Str to -> from)