我在Haskell中編寫了一些程序,它以某種方式操縱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文件,以便在更一般的方式提取所有出現的特定類型,如果可能,提取它們在源文件文本中的位置?
我相信你可以用http://hackage.haskell.org/package/haskell-src – Bergi 2013-03-05 13:50:16
@Bergi做些事情因此,看起來這個庫允許我將我的源代碼轉換爲抽象語法樹,然後我可以搜索特定類型的出現。似乎沒有任何方法可以在源文本結構和AST結構之間進行映射(然而,我需要找出其中哪些類型實際出現在源代碼中)。有沒有辦法保留至少行號或什麼的? – 2013-03-05 14:26:46