Haskell -检查自定义数据类型流相等的列表



所以我有这些数据类型:

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)

如果我不关心Number,我该如何寻找piece(例如black)呢?

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时出错),我认为这通常被认为是一个坏主意。

你可能知道这一点,但如果你不知道:deriving EqforPlayer将导致你所写的Eq实例。

相关内容

  • 没有找到相关文章

最新更新