Граф `Pat`s в модуле

Мне нужно посчитать количество Pat в хаскеле Module, Я знаю, что самый простой способ - это сопоставление с образцом на каждом уровне AST, в результате чего получается огромная функция, похожая на весь AST. Я считаю, что есть некоторый способ воспользоваться такими классами, как Functor или State Monad опираться на какую-то существующую функцию, которая ходит по дереву (например, prettyPrint) и проследить счетчик, но я не уверен, как именно он работает.

1 ответ

Решение

С помощью uniplate это очень просто:

import Data.Data
import Data.Generics.Uniplate.Data
import Control.Monad
import Language.Haskell.Exts

findPats :: Data a => a -> [Pat]
findPats = universeBi

test = do
  content <- readFile "Simple.hs"
  case parseModule content of
    ParseFailed _ e -> error e
    ParseOk a       -> do
      forM_ (findPats a) $ \p -> do
        putStrLn $ "got a pat: " ++ show p

По сути это просто universeBi функция.

Другие вопросы по тегам