实现读取类型类,其中解析字符串包含"$"

svo*_*sen 6 haskell linguistics

我和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)

iva*_*anm 5

你在Read这里虐待.

Show并且Read是为了打印和解析有效的Haskell值,使调试等,这并不总是完美(例如,如果您导入Data.Map合格,然后调用show一个Map值,调用fromList的资格都没有),但它是一个有效的起点.

如果要打印或解析值以匹配某些特定格式,则为前者使用漂亮的打印库,为后者使用实际的解析库(例如uu-parsinglib,polyparse,parsec等).它们通常对解析具有更好的支持ReadS(尽管ReadP在GHC中并不太糟糕).

虽然你可能会认为这不是必要的,但这只是你正在做的一个快速的黑客攻击,快速的任何黑客都有徘徊的倾向......帮自己一个忙,做正确的事第一次:这意味着当你想要在以后"正确"做到这一点时,重写的次数就会减少.