为了翻译Haskell,我投入了一段时间。
I需要遍历 HsModule结构(由parseModule源代码返回),将每个 HsIdent字符串(其中字符串是英语标识符)转换为 HsIdent字符串,其中字符串是其他一些自然语言(即意大利语、法语、.)中的标识符。
我想知道是否存在一些直接的策略,也许在TH中,是为了遍历一个HsModule结构(即对每个HsIdent字符串应用一个函数),而不对所涉及的子结构进行显式的展开函数?
我希望我的请求足够明确,非常感谢你的宝贵帮助。
诚挚的问候。
发布于 2014-08-30 13:25:51
我在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\""我希望它能对别人有用。
https://stackoverflow.com/questions/25530130
复制相似问题