我一直在玩Haskell大约一个月。对于我的第一个“真正的”Haskell项目,我正在编写一个词性标注器。作为该项目的一部分,我有一个名为Tag
类型代表部分的词性标记,实现如下:
data Tag = CC | CD | DT | EX | FW | IN | JJ | JJR | JJS ...
以上是我已经标准化部件的词性标记一长串故意截断。然而,在这个标准的标签集中,有两个以美元符号($)结尾:PRP $和NNP $。因为我的名字中不能有$类型的构造函数,所以我选择将它们重命名为PRPS和NNPS。
这一切都很好,但我想从词典中的字符串中读取标签,并将它们转换为我的Tag
类型。尝试此操作失败:
instance Read Tag where
readsPrec _ input =
(\inp -> [((NNPS), rest) | ("NNP$", rest) <- lex inp]) input
Haskell lexer chokes on $。任何想法如何把这个关掉?
实施显示相当简单。如果Read有一些类似的策略,那将会很棒。
instance Show Tag where
showsPrec _ NNPS = showString "NNP$"
showsPrec _ PRPS = showString "PRP$"
showsPrec _ tag = shows tag
绝大多数情况下,您应该自己编写自己的'Show'和'Read'实例,而不是使用自动派生的实例,如果您的数据类型隐藏其内部表示形式(如'Data.Set.Set '等等,它会吐出一个'fromList'调用)或者使用文字,例如一个'Num'的实例吐出它所对应的整数字面值。 –