在模块中计算`Pat`s

rem*_*rem 2 haskell uniplate

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

Eri*_*ikR 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
Run Code Online (Sandbox Code Playgroud)

基本上它只是universeBi功能.