我的程序中有令牌数据类型。看起来像这样:
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}
这样可以将令牌和位置存储在一起,但将它们干净地分开,避免重复。