Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 在匹配w/ViewPatterns之前映射模式同义词args?_Haskell_Pattern Matching - Fatal编程技术网

Haskell 在匹配w/ViewPatterns之前映射模式同义词args?

Haskell 在匹配w/ViewPatterns之前映射模式同义词args?,haskell,pattern-matching,Haskell,Pattern Matching,我最近试图将一个ADT重构成一个向后兼容的集合表示形式,其中构造函数的数量以组合方式增长: data Tag = TagFoo | TagBar !Text | TagBaz !Int ... -- many more deriving (Eq, Generic, Ord, Show) newtype Label = Label (HashSet Tag) deriving (Eq, Generic, Show) 为此,我定义了几个模式同

我最近试图将一个ADT重构成一个向后兼容的集合表示形式,其中构造函数的数量以组合方式增长:

data Tag = TagFoo | TagBar !Text | TagBaz !Int ... -- many more
           deriving (Eq, Generic, Ord, Show)

newtype Label = Label (HashSet Tag)
                deriving (Eq, Generic, Show)
为此,我定义了几个模式同义词,其效果如下:

{-#语言模式同义词}
{-#语言视图模式}
模式Foo::Label
模式Foo ts')->HashSet.fromList ts==ts')
这也是不可能的,因为
->
后面的部分是一个模式,不允许应用函数


是否有其他方法定义模式同义词以允许这种匹配?

标签是否真的需要成为模式?简单地提供一个函数有什么错:

pattern Tags ts <- ((\(Label ts') -> ts') -> HashSet.fromList ts == ts')
toLabel :: [Tags] -> Label
并让用户使用防护装置:

someFunction lab | lab == toLabel [TagFoo, TagBar "bar"] = ...

无序容器
也不能定义这样的同义词!
toLabel :: [Tags] -> Label
someFunction lab | lab == toLabel [TagFoo, TagBar "bar"] = ...