我需要为学校作业实现一个国际象棋游戏,并且您必须制作一个适用于同一棋盘上其他游戏的界面。因此,您必须实现棋子,但也必须实现其他游戏的棋子。
我试图这样做:
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 的第一个参数中' 在Just', namely
(f Rook) 的第一个参数中' 在表达式中:Just (f Rook)”
所以,我觉得 ChessPiece 需要以某种方式“铸造”为(常规)棋子。(我知道,我使用的是命令式编程中的术语,但我希望我在这里清楚自己,如果需要,我很乐意让我的问题更清楚)。
我试图实现的结构是可能的吗?(有点像 OO 语言中的类结构,但随后应用于数据类型,其中一种数据类型是另一种数据类型的子数据类型,并且对象可以同时是两种数据类型。例如,Rook 是 ChessPiece,因此一块)我做错了什么?关于如何实现我需要的结构的任何建议?