我一直在玩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'的實例吐出它所對應的整數字面值。 –