在Haskell中对我的数据子集进行模式匹配

Lan*_*ana 0 haskell pattern-matching

假设我有一个结构:

data MyType 
  = CV Int 
  | CA MyType MyType
  | CI
  | CD
  | CB
Run Code Online (Sandbox Code Playgroud)

我有一个期望MyType的函数,我只想匹配以下语法子集:

data MyTypeNoCV 
  = CA MyType MyType
  | CI
  | CD
  | CB
Run Code Online (Sandbox Code Playgroud)

我知道这在Haskell中是不可能的。有没有一种方法可以对结构进行参数化以某种方式标记节点?

Data.Void可能有帮助吗?

Typ*_*ats 5

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

data MyTypeNoCV 
  = CA MyType MyType
  | CI
  | CD
  | CB

data MyType
  = CV Int
  | CNonV MyTypeNoCV
Run Code Online (Sandbox Code Playgroud)

如果您想花更多的钱,可以使用GADT为数据类型指定索引。这是一个用Ty索引的示例Index

{-# 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
Run Code Online (Sandbox Code Playgroud)