繁体   English   中英

Haskell - 匹配类型实例

[英]Haskell - Match Type Instance

我已经定义了类似于以下的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])

partition函数似乎适合这个:

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

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

我会这样做:

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

我必须承认,我不明白为什么你不喜欢这个。 您无法与使用相等的构造函数进行比较,因为涉及未知参数。 模式匹配完全可以在这里完成。

模式匹配就是这里的答案。 它需要你额外的3行(包括类型签名),所以它不是一个很长的解决方案。 你可以写一些模板haskell一般可以做到这一点,但对于这么简单的东西来说,这似乎太复杂了。

isTypeC :: TypeData -> Bool
isTypeC (TypeC _) = True
isTypeC _ = False

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM