当我调用show/read时,Haskell打破了我的类型

pre*_*non 0 debugging haskell

我在haskell代码中定义了一个新类型,它将一个字符串列表列为记录.一个例子可能是
Board{size=(4,7),pieces=[["OA","AA","AA"],["BBB","BOO"],["OCCC","CCCO","OOCO"]]}

我已经将它设置为一个派生的实例ShowRead.如果我只是将上面的代码输入到ghci中,那么我就会得到我所放入的内容,这很好.但是,如果我用show来调用它,我会得到
"Board {size = (4,7), pieces = [[\"OA\",\"AA\",\"AA\"],[\"BBB\",\"BOO\"],[\"OCCC\",\"CCCO\",\"OOCO\"]]}"
语音标记很好,但我不知道为什么反斜杠存在.你不被允许下一个演讲标记或什么?在任何情况下,如果我试图打电话read来取回它,现在完全打破了.我试图告诉我没有任何字符串是数据构造函数,我得到一个很长的错误 - 我不知道为什么它认为它们是.

这有什么办法吗?

zig*_*zou 5

GHCI已经打电话了show.当您show something在GHCI下输入时,就像您打电话一样show $ show something.


Cir*_*dec 5

特定

> data Board = Board { size :: (Int, Int), pieces :: [[String]] } deriving (Show, Read)
> let b = Board{size=(4,7),pieces=[["OA","AA","AA"],["BBB","BOO"],["OCCC","CCCO","OOCO"]]}
Run Code Online (Sandbox Code Playgroud)

结果show b是一个String

> show b
"Board {size = (4,7), pieces = [[\"OA\",\"AA\",\"AA\"],[\"BBB\",\"BOO\"],[\"OCCC\",\"CCCO\",\"OOCO\"]]}"
Run Code Online (Sandbox Code Playgroud)

在使用字符串String时,任何引号都会被转义show.如果输出字符串,则会看到它不包含\字符.

> putStrLn $ show b
Board {size = (4,7), pieces = [["OA","AA","AA"],["BBB","BOO"],["OCCC","CCCO","OOCO"]]}
Run Code Online (Sandbox Code Playgroud)

产生的字符串show可以作为电路板再次读回read

> (read . show $ b) :: Board
Board {size = (4,7), pieces = [["OA","AA","AA"],["BBB","BOO"],["OCCC","CCCO","OOCO"]]}
Run Code Online (Sandbox Code Playgroud)