我有一个类型构造函数
Token
,它的所有数据构造函数都采用 Int
(在输入中遇到此标记的位置),也许还有一些有效负载:
data Token = EmptyToken Int -- just position
| ValueToken Int Int -- position and integer payload
| NameToken Int String -- position and string payload
当我想从令牌获取位置时,我最终得到了这段相当麻烦的代码:
position :: Token -> Int
position (EmptyToken position) = position
position (ValueToken position _) = position
position (NameToken position _) = position
这个样板让我觉得我正在从错误的方向接近整个主题。
使用某些共享属性(如位置)和某些不共享属性对数据进行编码的正确(或推荐)方法是什么?
像处理函数一样排除数据类型中的重复项。这是一种方法:
data Positioned a = Positioned Int a
data TokenData = Empty
| Value Int
| NameToken String
type Token = Positioned TokenData