我正在用 Haskell 编写一些程序,它们以某种方式操作 Haskell 源代码。我想做的一件事是提取特定类型的所有出现(以及它们的位置)。
我认为使用正则表达式的非常粗略的方法适用于简单的数据类型。例如,在以下图形代码中:
module Test where
import Picture
r1,r2,r3,r4 :: Region
r1 = Shape(Rectangle 2 2)
r2 = Shape(Ellipse 2 1.5)
r3 = Shape(RtTriangle 3 2)
r4 = Shape(Polygon [(-2.5, 2.5), (-3.0,0), (-1.7,-1.0), (-1.1,0.2),(-1.5,2.0)])
p1,p2,p3,p4 :: Picture
p1 = Region Red r1
p2 = Region Green r2
p3 = Region Blue r3
p4 = Region Yellow r4
pic :: Picture
pic = foldl Over EmptyPic [p1,p2,p3,p4]
我可以通过简单地创建一个正则表达式来提取每个数字,该表达式查找数字字符的每个实例,它们周围没有字母。同样,如果我想找到所有颜色,我可以硬编码一个正则表达式来搜索红色或绿色或蓝色......等的出现。
我用这种方法看到的问题是:
如果我想更改我正在搜索的类型,我必须硬编码该类型可能表现出来的所有可能方式
如果类型值作为函数调用的结果返回,则它不起作用。例如,如果 p1 改为:
p1 = 区域 (getColor 1) r1
在哪里:
getColor :: Int -> Color
getColor n
|n == 1 = Red
|otherwise = Green
是否有一种更通用的方法来解析 Haskell 文件,以便提取特定类型的所有出现,以及它们在源文件文本中的位置(如果可能)?