5

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

data TypeData = TypeA Int | TypeB String | TypeC Char deriving (Eq, Show)

在某些时候,我需要一种方法来过滤[TypeData]所有非 TypeC 实例。我正在尝试编写的函数的签名是:

-- Returns a tuple containing (TypeC elements, non-TypeC elements)
partitionTypeCs :: [TypeData] -> ([TypeData],[TypeData])

partition功能似乎适合此:

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

但是,我无法弄清楚什么函数会匹配类型签名TypeData -> Bool。看起来我需要一个可以确定类型实例是否属于特定实例的函数。我知道我可以通过编写另一个函数 ( isTypeC (TypeC _) = True) 来使用模式匹配,但是是否有更通用的方式或匹配类型实例的 lineline 方式?

4

2 回答 2

5

我会这样做:

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

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

于 2013-09-09T21:25:06.557 回答
3

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

isTypeC :: TypeData -> Bool
isTypeC (TypeC _) = True
isTypeC _ = False
于 2013-09-09T21:27:01.070 回答