在模块中计算`Pat`s

时间:2015-08-02 18:22:21

标签: haskell uniplate

我需要计算haskell PatModule的数量。我知道最简单的方法是在AST的每个级别上进行模式匹配,这将产生一个看起来像整个AST的巨大功能。我相信有一些方法可以利用像FunctorState Monad这样的类型来依赖一些现有的遍历树的函数(比如prettyPrint)并跟踪一个计数器,但是我我不确定它是如何工作的。

1 个答案:

答案 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功能。