繁体   English   中英

Haskell - 签入自定义数据类型列表 fow Equality

[英]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有其他用途。 您可以通过为CellPlayer字段命名来避免编写getPieceColor ,但是该访问器将是部分的(即在给定Empty时出错),我认为这通常被认为是一个坏主意。

您可能知道这一点,但如果您不知道:为Player deriving Eq将导致您编写的Eq实例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM