haskell中我的数据子集的模式匹配

haskell中我的数据子集的模式匹配,haskell,pattern-matching,Haskell,Pattern Matching,假设我有一个结构: data MyType = CV Int | CA MyType MyType | CI | CD | CB 我有一个需要MyType的函数,我只想匹配以下语法子集: data MyTypeNoCV = CA MyType MyType | CI | CD | CB 我知道这在哈斯克尔是不可能的。是否有一种方法可以参数化结构,以某种方式标记节点 Data.Void可能有帮助吗?如果您的函数无法处理CV,那么它可以不返回任何内容。这

假设我有一个结构:

data MyType 
  = CV Int 
  | CA MyType MyType
  | CI
  | CD
  | CB
我有一个需要MyType的函数,我只想匹配以下语法子集:

data MyTypeNoCV 
  = CA MyType MyType
  | CI
  | CD
  | CB
我知道这在哈斯克尔是不可能的。是否有一种方法可以参数化结构,以某种方式标记节点


Data.Void可能有帮助吗?

如果您的函数无法处理CV,那么它可以不返回任何内容。这里有一个简化的示例,其中只有两个数据选项,可以演示您希望实现的目标

data MyType=CV | CA
进程::MyType->可能是字符串
过程CV=无
进程CA=刚刚“得到CA!”
main=do
putStrLn“处理CA”
CA的案例过程
Nothing->putStrLn“Nothing”
只需x->putStrLn x
putStrLn“处理简历”
案例过程
Nothing->putStrLn“Nothing”
只需x->putStrLn x
然后在命令行上:

$runhaskell script.hs
加工钙
找到了CA!
加工CV
没有什么

最简单的解决方案就是拆分数据:

数据MyTypeNoCV
=CA MyType MyType
|词
|光盘
|CB
数据MyType
=CV Int
|CNonV MyTypeNoCV
如果您想更有趣,可以使用GADT为您的数据类型提供索引。下面是一个示例,其中
Ty
索引编制索引

{-#语言数据类型、GADT、KindSignatures}
数据索引=IsBaz | NotBaz
数据类型:索引->*其中
福:蒂诺巴兹
酒吧:蒂诺巴兹
Baz::Ty IsBaz
f::蒂诺巴兹->布尔
f Foo=True
f Bar=False