实例读Haskell

时间:2016-06-18 23:54:16

标签: haskell instance

我需要实现数据类型的读取实例

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'

任何想法?

2 个答案:

答案 0 :(得分:3)

首先,尝试在下次问题中包含更多信息和背景,因为它有用。

其次,您的问题似乎只是一个错字:readProcreadPrec类型类中的实际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实例? ShowRead用于对来自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 _ _ = []