[英]Pattern matching on a subset of my data in haskell
假设我有一个结构:
data MyType
= CV Int
| CA MyType MyType
| CI
| CD
| CB
我有一个期望MyType的函数,我只想匹配以下语法子集:
data MyTypeNoCV
= CA MyType MyType
| CI
| CD
| CB
我知道这在Haskell中是不可能的。 有没有一种方法可以对结构进行参数化以某种方式标记节点?
Data.Void可能有帮助吗?
最简单的解决方案是仅拆分数据:
data MyTypeNoCV
= CA MyType MyType
| CI
| CD
| CB
data MyType
= CV Int
| CNonV MyTypeNoCV
如果您想更加花哨,可以使用GADT为数据类型指定索引。 这是一个用Index
索引Ty
的示例。
{-# LANGUAGE DataKinds, GADTs, KindSignatures #-}
data Index = IsBaz | NotBaz
data Ty :: Index -> * where
Foo :: Ty NotBaz
Bar :: Ty NotBaz
Baz :: Ty IsBaz
f :: Ty NotBaz -> Bool
f Foo = True
f Bar = False
如果您的函数无法处理CV,则可以返回Nothing
。 这是一个简化的示例,其中只有2个数据选项,它们可能演示您要完成的任务
data MyType = CV | CA
process :: MyType -> Maybe String
process CV = Nothing
process CA = Just "Got CA!"
main = do
putStrLn "Processing CA"
case process CA of
Nothing -> putStrLn "Nothing"
Just x -> putStrLn x
putStrLn "Processing CV"
case process CV of
Nothing -> putStrLn "Nothing"
Just x -> putStrLn x
然后在命令行上:
$ runhaskell script.hs
Processing CA
Got CA!
Processing CV
Nothing
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.