列表中的下一个元素

时间:2016-04-25 15:36:59

标签: haskell

我想在haskell中获取列表的下一个元素,如:

beginn = 20
next 20 = 10
next 10 = 5
next 5 = 30
next 30 = 25
next 25 = 37
next 37 = 2
next 2 = 11
next 11 = 31
next _ = -1

我的清单是:Stack = [20,10,5,30,25,37,2,11,31]

我的代码是:

schlange  = [20,10,5,30,25,37,2,11,31]

beginn = head schlange

next y = if y `elem` schlange then [y]+1 else -1

但是不正确

1 个答案:

答案 0 :(得分:1)

首先,原始示例已经形成了定义:

next 20 = 10
next 10 = 5
next 5 = 30
next 30 = 25
next 25 = 37
next 37 = 2
next 2 = 11
next 11 = 31
next _ = -1

所以你可以坚持下去。

现在如果你想使用一个列表,那么你可以在这里使用模式匹配:

next e (x:y:ys)
  | e == x = Just y
  | otherwise = next e (y:ys)
next _ _ = Nothing

示例:

λ> next 10 schlange
Just 5
λ> next 37 schlange
Just 2

请注意,这将返回Maybe,因为元素e可能不在列表中(IMO这比返回-1更好)

@zeta提供了一个不错的无点/单行版本:

next e = listToMaybe . drop 1 . dropWhile (/= e)

你可能不知道Data.Maybe.listToMaybe - 它基本上是

listToMaybe [a:_] = Just a
listToMaybe []    = Nothing

并且该功能完成了它所说的内容:

  • 从列表前面删除 e的所有元素
  • 然后再放一个(e
  • 最后使用listToMaybe将第一个剩余元素变为Just' if there is any - if not return Nothing`

您的版本无效的原因是[y]这里根本没有任何意义 - [y]将是y的单例列表以及列表应该是什么>加 1是?为什么这会在这里返回一个数字?