我的程序中有令牌数据类型。看起来像这样:

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


但是这种解决方案对我来说似乎并不实用且美观。那么,对于这个问题有更好的解决方案吗?
谢谢。

最佳答案

是:

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


这样可以将令牌和位置存储在一起,但将它们干净地分开,避免重复。

10-04 12:54