3

現在、学校の課題でチェス ゲームを作成しており、駒が定義されています。

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

ここで、ピースを単一の文字 (キング = k、クイーン = q、ナイト = n など) として印刷する必要があります。黒いピースの場合、値はその白い値の首都です (キング = K、クイーン = Q、ナイト = N など) だから私は show の 3 つのインスタンスを作った

    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"

そして3つ目が問題です

    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

説明:

  • PiecePieceタプルではなく、コンストラクターを持つデータ型です(タイプ名とコンストラクターの両方が同じです)。したがって、タプルではなくコンストラクターでパターン マッチを行う必要があります。

  • toUpperand toLowerare present Data.Charand work on Charwhile like "B"are String(Stringは の型シノニムです[Char])。したがって、String大文字を作成するには、 を使用できますmap toUpper

  • 文字列の比較show color == "B"はあまり効率的ではありませんが、代わりにコンストラクター名でパターン マッチングを使用できます。

于 2012-10-16T14:57:34.077 に答える