是否有更简单的方法(可能是标准函数)来执行此操作:
(如果列表包含元素,则结果是列表的下一个元素;如果元素是列表的最后一个元素,则结果是列表的第一个元素."特殊情况":如果列表为空,结果是Nothing.如果列表不包含该元素,则结果是列表的第一个元素.)
import Data.List
next :: Eq a => Maybe a -> [a] -> Maybe a
next _ [] = Nothing
next Nothing (x:_) = Just x
next (Just x) list = Just $ list !! index
where index =
case elemIndex x list of
Nothing -> 0
Just xIndex ->
if xIndex + 1 == length list
then 0
else xIndex + 1
Run Code Online (Sandbox Code Playgroud)
让我们调用元素e和列表xs.如果你在开头放弃所有不相等的元素,它会变得容易多e了dropWhile (/= e).之后,您可以专注于两种情况,我们将始终返回一个值:
(_:y:_)以获取元素e并返回y总的来说,我们得到
next :: Eq a => Maybe a -> [a] -> Maybe a
next _ [] = Nothing
next Nothing (x:_) = Just x
next (Just e) l@(x:_) = Just $ case dropWhile (/= e) l of
(_:y:_) -> y
_ -> x
Run Code Online (Sandbox Code Playgroud)