我和Haskell玩了大约一个月.对于我的第一个"真正的"Haskell项目,我正在编写一个词性标记器.作为这个项目的一部分,我有一个名为Tag
代表词性标签的类型,实现如下:
data Tag = CC | CD | DT | EX | FW | IN | JJ | JJR | JJS ...
Run Code Online (Sandbox Code Playgroud)
以上是一长串标准化的词性标签,我有意将其截断.但是,在这个标准的标签集中,有两个以美元符号($)结尾:PRP $和NNP $.因为我的名字中没有带$的类型构造函数,所以我选择将它们重命名为PRPS和NNPS.
这一切都很好,但我想从词典中的字符串中读取标签并将它们转换为我的Tag
类型.尝试此操作失败:
instance Read Tag where
readsPrec _ input =
(\inp -> [((NNPS), rest) | ("NNP$", rest) <- lex inp]) input
Run Code Online (Sandbox Code Playgroud)
Haskell lexer在$上窒息.任何想法如何解决这个问题?
实施Show非常简单.如果有一些类似的Read策略会很棒.
instance Show Tag where
showsPrec _ NNPS = showString "NNP$"
showsPrec _ PRPS = showString "PRP$"
showsPrec _ tag = shows tag
Run Code Online (Sandbox Code Playgroud)