Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell:基于成员类型的筛选器集?_Haskell_Set_Subset - Fatal编程技术网

Haskell:基于成员类型的筛选器集?

Haskell:基于成员类型的筛选器集?,haskell,set,subset,Haskell,Set,Subset,假设我在Haskell中有以下数据结构来表示Checkers /绘图件: data Piece = Reg {pos :: Square, color :: Color} | King {pos :: Square, color :: Color} deriving (Show, Eq) 给定这些片段的列表,我如何将国王从列表中分离出来?我一直在查看Data.Set的文档,但找不到对我来说显而易见的东西 简言之,我需要一个方法,该方法将在给定数据.Set集合的片段的情

假设我在Haskell中有以下数据结构来表示Checkers /绘图件:

data Piece = Reg {pos :: Square, color :: Color}
         | King {pos :: Square, color :: Color}
    deriving (Show, Eq)
给定这些
片段的列表
,我如何将
国王
从列表中分离出来?我一直在查看
Data.Set
的文档,但找不到对我来说显而易见的东西


简言之,我需要一个方法,该方法将在给定
数据.Set
集合的
片段
的情况下,返回所有
King
类型片段的子集。我觉得这很简单,但我还没有遇到过,因为我对Haskell中的Data.Set类还不熟悉。

您可以定义一个布尔函数
isKing
,然后在
Data.Set
中使用
过滤器,如下所示:

import Data.Set as S
data Color = Int deriving (Show, Eq)
data Square = Square (Int,Int) deriving (Show, Eq)
data Piece = Reg {pos :: Square, color :: Color}
         | King {pos :: Square, color :: Color}
    deriving (Show, Eq)

isKing King{} = True
isKing _ = False

getKings s = S.filter isKing s

为什么不做
data-PieceType=Reg | King
data-Piece=Piece{PieceType::PieceType,pos::Square,color::color}
?然后你可以只过滤该字段的值:
过滤(==King).PieceType)
。显然,您希望为此导出
Eq
,请参见
isKing{}=True
以避免在字段数量发生变化时更改
isKing