Граф `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
функция.