好吧,基本上,我遇到了一个问题,如何让haskell中的函数像这样工作:取字符串的第一个元素,然后取第二个元素并比较它们,然后函数应该继续取第三个元素从字符串中比较第二个和第三个。
如果必须比较前两个,那么接下来的两个会很容易,但在这种特殊情况下我无法弄清楚。
我需要完成这一步才能编写一个函数,如果找到两个相同的相邻元素,则返回 True,如果没有类似的元素则返回 False。
谢谢你的帮助。
好吧,基本上,我遇到了一个问题,如何让haskell中的函数像这样工作:取字符串的第一个元素,然后取第二个元素并比较它们,然后函数应该继续取第三个元素从字符串中比较第二个和第三个。
如果必须比较前两个,那么接下来的两个会很容易,但在这种特殊情况下我无法弄清楚。
我需要完成这一步才能编写一个函数,如果找到两个相同的相邻元素,则返回 True,如果没有类似的元素则返回 False。
谢谢你的帮助。
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
你可以创建一个递归函数来解决这个问题。有3种情况你必须处理:
False
。True
.如果您希望我提供执行此操作的代码,或者您不想要更多提示,请告诉我。
编辑:解决方案(悬停显示)
hasNeighbors :: Eq a => [a] -> True
hasNeighbors (a : allExceptA @ (b : _))
| a == b = True
| otherwise = hasNeighbors allExceptA
hasNeighbors _ = False