[英]Zip Element in a list in 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 ] --> [B, A, A, B, A, B ]
但它不起作用。 另外,当我编译代码时,Haskell返回如下警告:
Warning:
Pattern match(es) are overlapped
In an equation for 'zS':
我怎样才能解决这个问题?
TL; DR
当您定义具有多个模式的函数时,应在开头定义过于具体的模式,而在末尾定义更广泛的模式。
说明
就你而言
zS (B:xs) = B : zS xs
已经匹配任何以B
开头的列表。 所以,
zS (B:B:xs) = B : zS xs
zS (B:A:xs) = B : A : zS xs
将已经由zS (B:xs) = B : zS xs
匹配zS (B:xs) = B : zS xs
本身。 这就是为什么Haskell这么说的原因
Pattern match(es) are overlapped
要解决此问题,请在开始时定义特定的模式,如下所示
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) = B : zS xs
在这里,如果找到两个匹配项,并且无论B
重复多少次,都包括B
相反,您可以像这样递归
zS (B:B:xs) = zS (B:xs)
以便
zS (B:A:xs) = B : A : zS xs
将为您重复B
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.