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可能有帮助吗?
最简单的解决方案是仅拆分数据:
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)