Haskell - 显示实例多个数据类型

时间:2012-10-16 14:47:37

标签: haskell types instance show

我正在为学校作业制作国际象棋游戏,我的作品已定义

    data Piece = Piece { piecetype :: PieceType, color :: PieceColor }
    data PieceType = Pawn | Knight | Bishop | Rook | Queen | King
    data PieceColor = Black | White deriving Eq

现在我必须打印一块作为单个字符(king = k,queen = q,knight = n等),黑色片段的值是其白色值的大写(king = K,queen = Q ,骑士= N等) 所以我做了三个show

的实例
    instance Show PieceColor where
        show Black = "B"
        show White = "W"

    instance Show PieceType where
        show Pawn = "P"
        show Knight = "N"
        show Bishop = "B"
        show Rook = "R"
        show Queen = "Q"
        show King = "K"

,第三个是问题

    instance Show Piece where
        show (piecetype, color) = show piecetype 
                                  if show color == "W"
                                  then show piecetype
                                  else toUpper (show piecetype)

我收到以下错误(我也尝试了很多但是根据此链接我似乎非常接近Something somewhat similar

Couldn't match expected type `Piece' with actual type `(t0, t1)'

我感谢任何帮助 亲切的问候,我

1 个答案:

答案 0 :(得分:8)

直接答案:

instance Show Piece where
    show (Piece piecetype Black) = map toLower $ show piecetype
    show (Piece piecetype White) = show piecetype

说明:

  • Piece是一个带构造函数Piece的数据类型(类型名称和构造函数对于您的情况都相同)而不是元组。所以你应该在构造函数上进行模式匹配而不是元组。

  • toUppertoLower出现在Data.Char中并在Char上工作,"B"之类的内容为String({{ 1}}是String)的类型同义词。因此,要使[Char]大写,您可以使用String

  • 比较像map toUpper这样的字符串效率不高,您可以在构造函数名称上使用模式匹配。