【问题标题】:Haskell: Filter set based on member type?Haskell:基于成员类型的过滤器集?
【发布时间】:2014-10-21 01:55:47
【问题描述】:

假设我在 Haskell 中有以下数据结构来表示 Checkers /草稿:

data Piece = Reg {pos :: Square, color :: Color}
         | King {pos :: Square, color :: Color}
    deriving (Show, Eq)

鉴于这些Pieces 的列表,我如何从列表中隔离Kings?我一直在查看Data.Sethttp://www.haskell.org/ghc/docs/7.6.2/html/libraries/containers-0.5.0.0/Data-Set.html 的文档,但找不到对我来说似乎很明显的东西。

简而言之,我需要一个方法,给定一个Data.Set 集合Piece,返回所有King 类型片段的子集。我觉得这是一件非常简单的事情,但我还没有遇到过,因为我是 Haskell 中 Data.Set 类的新手。

【问题讨论】:

  • 为什么不使用data PieceType = Reg | Kingdata Piece = Piece { pieceType :: PieceType, pos :: Square, color :: Color }
  • 然后您可以过滤该字段的值:filter ((== King) . pieceType)。显然你想为此派生Eq

标签: haskell set subset


【解决方案1】:

可以定义一个布尔函数isKing,然后在Data.Set中使用filter,如下:

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

【讨论】:

  • isKing King{} = True 让您避免在字段数量发生变化时更改 isKing
猜你喜欢
  • 1970-01-01
  • 2020-05-17
  • 2011-04-04
  • 1970-01-01
  • 1970-01-01
  • 2020-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多