List Haskell中列表中的Zip元素

List Haskell中列表中的Zip元素,list,haskell,List,Haskell,Haskell中的以下函数存在一个问题,即仅压缩列表中的元素B: data El = A | B deriving (Show) zS :: [El] -> [El] zS [] = [] zS (A:xs) = A : zS xs zS (B:xs) = B : zS xs zS (B:B:xs) = B : zS xs zS (B:A:xs) = B : A : zS xs 当我测试功能zS时,结果应该是: zS [B, B, A, A, B, B, B, A, B ] -->

Haskell中的以下函数存在一个问题,即仅压缩列表中的元素B:

data El = A | B deriving (Show)

zS :: [El] -> [El]
zS [] = []
zS (A:xs) = A : zS xs
zS (B:xs) = B : zS xs
zS (B:B:xs) = B : zS xs
zS (B:A:xs) = B : A : zS xs
当我测试功能zS时,结果应该是:

zS [B, B, A, A, B, B, B, A, B ] --> [B, A, A, B, A, B ]
但它不起作用。另外,当我编译代码时,Haskell会返回如下警告:

 Warning:
    Pattern match(es) are overlapped
    In an equation for 'zS':
我如何解决这个问题?

TL;博士

当您使用多个模式定义函数时,应该在开始时定义过于具体的模式,并在结束时定义更广泛的模式

解释

就你而言

zS (B:xs) = B : zS xs
已经匹配任何以B开头的列表。所以

将已经由zS B:xs=B:zS-xs本身匹配。这就是为什么哈斯凯尔说

模式匹配是重叠的 要解决这个问题,请在开始时定义特定的模式,如下所示

zS :: [El] -> [El]
zS [] = []
zS (B:B:xs) = B : zS xs
zS (B:A:xs) = B : A : zS xs
zS (A:xs) = A : zS xs
zS (B:xs) = B : zS xs
zS (B:B:xs) = zS (B:xs)
注意:您的代码有一个bug

zS (B:B:xs) = B : zS xs
这里,如果你找到了两个匹配项,不管B重复了多少次,你就包括了B。相反,您可以这样递归

zS :: [El] -> [El]
zS [] = []
zS (B:B:xs) = B : zS xs
zS (B:A:xs) = B : A : zS xs
zS (A:xs) = A : zS xs
zS (B:xs) = B : zS xs
zS (B:B:xs) = zS (B:xs)
所以

zS (B:A:xs) = B : A : zS xs
将为您处理重复的Bs。

TL;博士

当您使用多个模式定义函数时,应该在开始时定义过于具体的模式,并在结束时定义更广泛的模式

解释

就你而言

zS (B:xs) = B : zS xs
已经匹配任何以B开头的列表。所以

将已经由zS B:xs=B:zS-xs本身匹配。这就是为什么哈斯凯尔说

模式匹配是重叠的 要解决这个问题,请在开始时定义特定的模式,如下所示

zS :: [El] -> [El]
zS [] = []
zS (B:B:xs) = B : zS xs
zS (B:A:xs) = B : A : zS xs
zS (A:xs) = A : zS xs
zS (B:xs) = B : zS xs
zS (B:B:xs) = zS (B:xs)
注意:您的代码有一个bug

zS (B:B:xs) = B : zS xs
这里,如果你找到了两个匹配项,不管B重复了多少次,你就包括了B。相反,您可以这样递归

zS :: [El] -> [El]
zS [] = []
zS (B:B:xs) = B : zS xs
zS (B:A:xs) = B : A : zS xs
zS (A:xs) = A : zS xs
zS (B:xs) = B : zS xs
zS (B:B:xs) = zS (B:xs)
所以

zS (B:A:xs) = B : A : zS xs

将为您处理重复的Bs。

不确定您的函数顺序是否与此处相关。B:xs是B:B:xs的超集。因此,如果你把更特殊的情况向上移动,可能会有所帮助。不确定你的函数顺序是否与此相关。B:xs是B:B:xs的超集。因此,如果您将更专业的案例向上移动,可能会有所帮助。@user2225104适用于希望了解简明解决方案而不是阅读长文本的人。它很有效!多谢各位@user2225104是为那些想知道清晰的解决方案而不是阅读长文本的人准备的。它很有效!非常感谢你!