我需要计算haskell Pat
中Module
的数量。我知道最简单的方法是在AST的每个级别上进行模式匹配,这将产生一个看起来像整个AST的巨大功能。我相信有一些方法可以利用像Functor
或State Monad
这样的类型来依赖一些现有的遍历树的函数(比如prettyPrint
)并跟踪一个计数器,但是我我不确定它是如何工作的。
答案 0 :(得分:6)
使用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
功能。