我想在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
但是不正确
答案 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是?为什么这会在这里返回一个数字?