Data structures 遍历抽象语法树

Data structures 遍历抽象语法树,data-structures,abstract-syntax-tree,Data Structures,Abstract Syntax Tree,我试图翻译哈斯克尔 我需要遍历HsModule结构(由parseModule源返回), 翻译每个HsIdent字符串,其中字符串是英文标识符 转换为HsIdent String,其中String是其他自然语言(如意大利语、法语等)中的标识符 我想知道是否存在一些直接的策略,可能是在TH中,走HsModule结构(即对每个HsIdent字符串应用一个函数),而不对涉及的子结构使用显式展开函数 我希望我的要求是直截了当的;非常感谢你宝贵的帮助 致以最诚挚的问候。我在Data.Generics包中找到

我试图翻译哈斯克尔

我需要遍历HsModule结构(由parseModule源返回), 翻译每个HsIdent字符串,其中字符串是英文标识符 转换为HsIdent String,其中String是其他自然语言(如意大利语、法语等)中的标识符

我想知道是否存在一些直接的策略,可能是在TH中,走HsModule结构(即对每个HsIdent字符串应用一个函数),而不对涉及的子结构使用显式展开函数

我希望我的要求是直截了当的;非常感谢你宝贵的帮助


致以最诚挚的问候。

我在Data.Generics包中找到了一个解决方案

HsModule是数据的一个实例,并且是可键入的,因此可以使用通用包的遍历函数来处理它。我选择了,因为它很好

我的解决办法是:

module Main where

import Data.Generics
import Language.Haskell.Syntax
import Language.Haskell.Parser
import Language.Haskell.Pretty
import Control.Monad

translate:: ParseResult HsModule -> Maybe String
translate r = case r of
                ParseOk a -> Just (show $ prettyPrint $ translateHsIdent "_italian" a)
                ParseFailed _ _ -> Nothing

translateHsIdent :: Data a => String -> a -> a
translateHsIdent k = everywhere (mkT (addStrangerIdentifier k))
    where
      addStrangerIdentifier :: String -> HsName -> HsName
      addStrangerIdentifier s (HsIdent i) = HsIdent (i ++ s)

main = maybe (putStrLn "Parse Error") putStrLn result
    where 
      result :: Maybe String
      result = translate $ parseModule "main = putStrLn \"Just a Try\""
我希望它能对其他人有用