Haskell-匹配类型实例

Haskell-匹配类型实例,haskell,types,filtering,instance,data-partitioning,Haskell,Types,Filtering,Instance,Data Partitioning,我定义了一个类似于以下内容的Haskell类型: data TypeData = TypeA Int | TypeB String | TypeC Char deriving (Eq, Show) 在某些时候,我需要一种方法来过滤所有非TypeC实例的[TypeData]。我试图编写的函数的签名是: -- Returns a tuple containing (TypeC elements, non-TypeC elements) partitionTypeCs :: [TypeData] -

我定义了一个类似于以下内容的Haskell类型:

data TypeData = TypeA Int | TypeB String | TypeC Char deriving (Eq, Show)
在某些时候,我需要一种方法来过滤所有非TypeC实例的
[TypeData]
。我试图编写的函数的签名是:

-- Returns a tuple containing (TypeC elements, non-TypeC elements)
partitionTypeCs :: [TypeData] -> ([TypeData],[TypeData])
分区
函数似乎适用于此:

-- Attempt:
partitionTypeCs data = partition (TypeData -> Bool) data

但是,我无法确定哪个函数与类型签名匹配
TypeData->Bool
。看起来我需要一个函数来确定类型实例是否属于特定实例。我知道我可以通过编写另一个函数来使用模式匹配(
isTypeC(TypeC))=True
),但是有没有一种更通用的方法或一种线条方式来匹配类型实例呢?

我会这样做:

partitionTypeCs = partition f where
  f (TypeC _) = False
  f _ = True

我必须承认我不明白你为什么不喜欢这个。无法与使用相等的构造函数进行比较,因为其中涉及未知参数。模式匹配正是这里必须做的事情。

模式匹配几乎就是这里的答案。它需要额外的3行代码(包括类型签名),所以它不是一个很长的解决方案。您可能会编写一些模板haskell,通常可以做到这一点,但对于如此简单的事情来说,这似乎太复杂了

isTypeC::TypeData->Bool
isTypeC(TypeC 41;)=真
isTypeC=错误