获取列表中的下一个元素

Nau*_*ika 0 haskell

是否有更简单的方法(可能是标准函数)来执行此操作:

(如果列表包含元素,则结果是列表的下一个元素;如果元素是列表的最后一个元素,则结果是列表的第一个元素."特殊情况":如果列表为空,结果是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)

Zet*_*eta 7

让我们调用元素e和列表xs.如果你在开头放弃所有不相等的元素,它会变得容易多edropWhile (/= e).之后,您可以专注于两种情况,我们将始终返回一个值:

  1. 其余列表至少包含两个元素.我们可以模式匹配(_:y:_)以获取元素e并返回y
  2. 剩下的列表要么只包含一个元素,要么为空.在这种情况下,我们可以返回原始的第一个元素.

总的来说,我们得到

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)