如何检查字符串/数组中的两个邻居(元素)是否相同

时间:2012-05-09 23:37:54

标签: function haskell functional-programming

基本上,我遇到了一个问题,如何让haskell中的函数像这样工作:  获取字符串的第一个元素,然后取第二个元素并进行比较,然后函数应继续从字符串中取第三个元素并比较第二个和第三个元素。

如果它必须比较前两个然后接下来的两个就很容易,但我无法在这种特殊情况下弄明白。

我需要实现这一步,以便编写一个函数,如果找到两个相同的相邻元素,则返回True,如果没有任何元素,则返回False。

感谢您的帮助。

2 个答案:

答案 0 :(得分:6)

实现此目的的更高阶方法(即没有显式递归)是使用zipWith执行列表中元素的逐点比较,从第一个开始,对照列表的元素,从第二个开始(使用tail),然后使用or将逐点结果折叠为单个结果。你甚至不需要特殊情况下的空列表,因为如果第二个参数是空列表,zipWith在第三个参数中是非严格的。

编辑:解决方案(悬停显示)

  

hasNeighbors as = or . zipWith (==) as $ tail as

答案 1 :(得分:2)

您可以创建一个解决此问题的递归函数。您必须处理3种情况:

  1. 如果函数获取空列表或一个元素的列表,那么显然它不会包含任何邻居,因此您返回False
  2. 如果列表以两个不相等的项开头,则表示它不以邻居对开头,因此您应该对除第一个元素之外的所有列表执行检查。
  3. 如果列表以两个相等的项开头,则表示该列表包含邻居对,因此您可以返回True
  4. 告诉我,如果您希望我提供执行此操作的代码,或者您不想再提示。

    编辑:解决方案(悬停显示)

      

    hasNeighbors :: Eq a => [a] -> True
    hasNeighbors (a : allExceptA @ (b : _))
      | a == b = True
      | otherwise = hasNeighbors allExceptA
    hasNeighbors _ = False