2014-08-27 4 views
0

Я погрузился в attemp, чтобы перевести Haskell.Перемещение абстрактного дерева синтаксиса

мне нужно ходитьHsModule структуры (возвращаемый источником parseModule), переводить каждыйHsIdent Строки, где строка является английским идентификатором вHsIdent Строки, где строка представляет собой идентификатор в каком-либо другом естественном языке (т.е. итальянский, французский, ...).

Интересно, существует ли какая-либо прямая стратегия, возможно, в TH, для того, чтобы ходить по структуре HsModule (т. Е. Применять функцию к каждой строке HsIdent) без явных разворачивающих функций для задействованных подструктур?

Надеюсь, я был достаточно прост в моей просьбе; большое спасибо за вашу драгоценную помощь.

С уважением.

ответ

0

Я нашел решение в пакетах Data.Generics.

HsModule является экземпляром данных и печатаемых, поэтому он имеет право обрабатывать его с помощью траверсы функции родового пакета. Я выбрал 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\"" 

Я надеюсь, что это может быть полезным для кого-то другого.

Смежные вопросы