3

我目前正在为学校作业制作国际象棋游戏,并且我的棋子已定义

    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,knight = 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)

我收到以下错误(我也尝试了很多比这更多的但根据这个链接我看起来很接近的东西有点相似

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

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

4

1 回答 1

8

直接回答:

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

说明:

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

  • toUpper并且toLower出现在Data.Char并且正在工作,Char而像是(是类型的同义词)之类"B"的东西。因此,要制作大写字母,您可以使用.StringString[Char]Stringmap toUpper

  • 比较类似字符串show color == "B"的效率不是很高,而是可以在构造函数名称上使用模式匹配。

于 2012-10-16T14:57:34.077 回答