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