我正在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 = Region(getColor 1)r1
其中:
getColor :: Int -> Color
getColor n
|n == 1 = Red
|otherwise = Green
是否有更通用的方法来解析Haskell文件,以便提取特定类型的所有匹配项,如果可能,还提取它们在源文件文本中的位置?