所以我有这些数据类型:
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
有其他用途。您可以通过给Cell
的Player
字段一个名称来避免写getPieceColor
,但该访问器将是部分的(即在给定Empty
时出错),我认为这通常被认为是一个坏主意。
你可能知道这一点,但如果你不知道:deriving Eq
forPlayer
将导致你所写的Eq
实例。