学校の課題にチェスゲームを実装する必要があります。同じボード上の他のゲームで機能するインターフェイスを作成する必要があります。したがって、チェスの駒だけでなく、他のゲームの駒も実装する必要があります。
私はこれをやろうとしました:
data ChessPiece = King | Queen | Knight | Rook | Bishop | Pawn deriving (Enum, Eq, Show)
data Piece = ChessPiece | OtherGamePiece deriving (Enum, Eq, Show)
data ColoredPiece = White Piece | Black Piece
data Board = Board { boardData :: (Array Pos (Maybe ColoredPiece)) }
次に、チェスゲームの開始を次のようにロードしようとします。
beginBoard = Board (listArray (Pos 0 0, Pos 7 7) (pieces White ++ pawns White ++ space ++ pawns Black ++ pieces Black)) where
pieces :: (Piece -> ColoredPiece) -> [Maybe ColoredPiece]
pieces f = [Just (f Rook), Just (f Knight), Just (f Bishop), Just (f Queen), Just (f King), Just (f Bishop), Just (f Knight), Just (f Rook)]
pawns :: (Piece -> ColoredPiece) -> [Maybe ColoredPiece]
pawns f = (take 8 (repeat (Just (f Pawn))))
space = take 32 (repeat Nothing)
Piece' with actual type
そして、「期待されるタイプのChessPieceと一致しませんでした」というエラーが表示されます。「f', namely
Rookの最初の引数で」「(fRook)の最初の引数でJust', namely
」「式:Just(f Rook)」
ですから、ChessPieceはどういうわけか(通常の)ピースに「キャスト」する必要があると感じています。(私は命令型プログラミングの用語を使用していますが、ここで自分自身を明確にしたいと思います。必要に応じて質問を明確にしたいと思います)。
私が可能にしようとしている構成はありますか?(オブジェクト指向言語のクラス構造のようなものですが、データ型に適用されます。一方のデータ型はもう一方のサブデータ型であり、オブジェクトは同時に2つのデータ型にすることができます。たとえば、RookはChessPieceであるため、ピース)私は何が間違っているのですか?必要な構造を実装する方法について何か提案はありますか?