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