我需要实现数据类型的读取实例
data GameAction = GameAction (Int, Int) deriving (Eq)
我做了这个
instance Read GameAction where
readProc (x:xs:_) = setGA (read x) (read xs)
但我得到了错误
`readProc' is not a (visible) method of class `Read'
任何想法?
答案 0 :(得分:3)
首先,尝试在下次问题中包含更多信息和背景,因为它有用。
其次,您的问题似乎只是一个错字:readProc
与readPrec
类型类中的实际Read
方法相比。
第三,实施Read
不是必要的,因为它可以很容易地得出:
data GameAction = GameAction (Int, Int) deriving (Show,Eq,Read)
在ghci:
ghci> let x = GameAction (5,6)
ghci> (read . show) x == id x
True
所以你去吧。
但更重要的是,为什么要尝试手动实现Read
实例? Show
和Read
用于对来自String
的数据类型进行编码/解码,这些数据类型仅用于调试目的。如果您想要比自动派生的Read
实例提供的更专业的东西,您可能正在寻找比Read
应该使用的更多的东西。如果要将UTF-8字符串解析为数据类型,请查看将text
库与attoparsec
库组合在一起。
答案 1 :(得分:2)
谢谢大家。
我可以解决我的问题,例如关注
instance Read GameAction where
readsPrec _ (x:y:rest) = let board = read [x] :: Int;
cel = read [y] :: Int;
in
if all isDigit [x,y] then
[(setGA board cel, rest)]
else []
readsPrec _ _ = []