我已经和 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 词法分析器在 $ 上窒息。任何想法如何解决这个问题?
实施 Show 相当简单。如果 Read 有类似的策略,那就太好了。
instance Show Tag where
showsPrec _ NNPS = showString "NNP$"
showsPrec _ PRPS = showString "PRP$"
showsPrec _ tag = shows tag