1

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

如果必须比较前两个,那么接下来的两个会很容易,但在这种特殊情况下我无法弄清楚。

我需要完成这一步才能编写一个函数,如果找到两个相同的相邻元素,则返回 True,如果没有类似的元素则返回 False。

谢谢你的帮助。

4

2 回答 2

6

A higher-order way to accomplish this (i.e. no explicit recursion) is to use zipWith to perform a point-wise comparison of the elements in the list, starting with the first, against the elements of the list, starting from the second (using tail), and then using or to collapse the point-wise results into a single result. You don't even need to special case the empty list since zipWith is non-strict in its third argument if its second argument is the empty list.

EDIT: Solution (hover to reveal)

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

于 2012-05-09T23:52:24.217 回答
2

你可以创建一个递归函数来解决这个问题。有3种情况你必须处理:

  1. 如果函数得到一个空列表或一个元素的列表,那么显然它不会包含任何邻居,所以你 return False
  2. 如果列表以两个不相等的项目开头,则意味着它不是以邻居对开头,因此您应该检查除第一个元素之外的所有列表。
  3. 如果列表以两个相等的项目开头,则您知道该列表包含一对邻居,因此您可以返回True.

如果您希望我提供执行此操作的代码,或者您不想要更多提示,请告诉我。

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

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

于 2012-05-09T23:43:03.947 回答