[英]Haskell - Checking in a List of a custom Data type fow Equality
所以我有这些数据类型:
data Player = Black | White deriving Show
data Cell = Piece Player Int | Empty deriving Show
type Board = [[Cell]]
这个例子:
instance Eq Player where
(==) Black Black = True
(==) White White = True
(==) _ _ = False
我想知道棋盘上当前的黑子数量。
我确实知道如果我想找出板上特定部分的数量,我可以这样做:
getSpecificPiece :: Board -> [Player]
getSpecificPiece b = concat (map (filter (== Piece Black 170)) b)
如果我不关心数字,我该如何寻找例如黑色的棋子?
concat (map (filter (== Piece Black _ )) b)
例如,这是我尝试过但没有用的东西。
编辑添加:我不完全确定我回答了正确的问题; 这解释了如何计算黑块,但如果您需要,则需要稍作修改,例如,改为黑块列表。
你可以做
countBlackPieces :: Board -> Int
countBlackPieces = length . filter hasBlackPiece . concat
where hasBlackPiece (Piece Black _) = True
hasBlackPiece _ = False
要么
import Data.Maybe (mapMaybe)
getPieceColor :: Cell -> Maybe Color
getPieceColor (Piece player _) = Just player
getPieceColor _ = Nothing
countBlackPieces :: Board -> Int
countBlackPieces = length . filter (== Black) . mapMaybe getPieceColor . concat
我可能会写第一个,除非我对getPieceColor
有其他用途。 您可以通过为Cell
的Player
字段命名来避免编写getPieceColor
,但是该访问器将是部分的(即在给定Empty
时出错),我认为这通常被认为是一个坏主意。
您可能知道这一点,但如果您不知道:为Player
deriving Eq
将导致您编写的Eq
实例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.