2013-05-12 7 views
2

У меня есть тип данных Token в моей программе. Это выглядит примерно так:Добавить дополнительную информацию к haskell type

data Token 
    = StringToken Strin 
    | NumberToken Integer 
    | IfToken 
    | ElseToken 
    ... -- lots of tokens here 

Я использую этот тип данных в своем парсерном мураве, и он отлично работает. Но теперь я хочу добавить дополнительную информацию к токенам (информация о местоположении источника). Поэтому я могу изменить свою декларацию типа данных и использовать записи:

data Token 
    = StringToken {value :: String, srcLoc :: SourceLocation} 
    | NumberToken {value :: String, srcLoc :: SourceLocation} 
    | IfToken {srcLoc :: SourceLocation} 
    | ElseToken {srcLoc :: SourceLocation} 
    ... -- lots of tokens here 

Но это решение кажется мне не очень практичным и красивым. Так лучше ли решение этой проблемы? Спасибо.

+0

http://stackoverflow.com/questions/16204177/how-should-i-represent-an-ast-annotated-with-additional-information – Arjan

+0

@Arjan спасибо, это полезная ссылка для меня. – sergeyz

ответ

8

Да:

data TokenLoc = TokenLoc {tok::Token , srcLoc::SourceLocation} 

Это сохраняет маркер и расположение вместе, но аккуратно держит их отдельно, избегая повторения.

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