我试图翻译Haskell。
我需要步行 HsModule结构(由parseModule源返回), 翻译每个 HsIdent String ,其中String是英文标识符 into HsIdent String ,其中String是其他一些自然语言的标识符(即意大利语,法语,......)。
我想知道是否存在一些直接策略,也许是在TH中,可以使用HsModule结构(即将函数应用于每个HsIdent字符串),而不涉及所涉及子结构的显式展开函数?
我希望我的要求足够清楚;非常感谢你的宝贵帮助。
最好的问候。
答案 0 :(得分:0)
我在Data.Generics包中找到了一个解决方案。
HsModule是 Data 和 Typeable 的一个实例,因此它有资格使用Generic包的遍历函数来处理它。我之所以选择SYB是因为documented非常好。
我的解决方案是:
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\""
我希望它对其他人有用。