Я бы сжал список с хвостом, чтобы у вас были пары элементов
имеется в наличии. Тогда вы можете просто использовать find
в списке пар:
f :: [Int] -> Maybe (Int, Int)
f xs = find ((>3) . snd) (zip xs (tail xs))
> f [1..10]
Just (3,4)
Если элемент first соответствует предикату, он вернется
Nothing
(или второе совпадение, если оно есть), поэтому вам может понадобиться специальный случай, если вы хотите что-то
отличается.
Как говорит Робин Зигмонд, break
также может работать:
g :: [Int] -> (Int, Int)
g xs = case break (>3) xs of (_, []) -> error "not found"
([], _) -> error "first element"
(ys, z:_) -> (last ys, z)
(Или это возвращение также Maybe
, в зависимости от того, что вам нужно.)
Но это, я думаю, сохранит весь префикс ys
в памяти до
находит совпадение, тогда как f
может начать сборку мусора
оно прошло мимо. Для небольших списков это не имеет значения.