基本上,我遇到了一个问题,如何让haskell中的函数像这样工作: 获取字符串的第一个元素,然后取第二个元素并进行比较,然后函数应继续从字符串中取第三个元素并比较第二个和第三个元素。
如果它必须比较前两个然后接下来的两个就很容易,但我无法在这种特殊情况下弄明白。
我需要实现这一步,以便编写一个函数,如果找到两个相同的相邻元素,则返回True,如果没有任何元素,则返回False。
感谢您的帮助。
答案 0 :(得分:6)
实现此目的的更高阶方法(即没有显式递归)是使用zipWith
执行列表中元素的逐点比较,从第一个开始,对照列表的元素,从第二个开始(使用tail
),然后使用or
将逐点结果折叠为单个结果。你甚至不需要特殊情况下的空列表,因为如果第二个参数是空列表,zipWith
在第三个参数中是非严格的。
编辑:解决方案(悬停显示)
hasNeighbors as = or . zipWith (==) as $ tail as
答案 1 :(得分:2)
您可以创建一个解决此问题的递归函数。您必须处理3种情况:
False
。True
。告诉我,如果您希望我提供执行此操作的代码,或者您不想再提示。
编辑:解决方案(悬停显示)
hasNeighbors :: Eq a => [a] -> True
hasNeighbors (a : allExceptA @ (b : _))
| a == b = True
| otherwise = hasNeighbors allExceptA
hasNeighbors _ = False