Haskellのソースコードを特定の方法で操作するプログラムをHaskellで書いています。私がやりたいことの1つは、特定のタイプのすべてのオカレンス(および場合によってはそれらの位置も)を抽出することです。
正規表現を使用する非常に大雑把な方法は、単純なデータ型で機能すると思いました。たとえば、次のグラフィックコードでは次のようになります。
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ファイルを解析して、特定のタイプのすべてのオカレンスと、可能であれば、ソースファイルのテキスト内でのそれらの位置を抽出するためのより一般的な方法はありますか?