Краткий ответ: он будет построен только для элемента, который вы ищете. Это означает, что только в худшем случае вам потребуется построить весь список, то есть когда ни один элемент не удовлетворяет условиям.
Длинный ответ: позвольте мне объяснить, почему с парой примеров:
ghci> head [a | (a,b) <- zip [1..] [1..], a > 10]
11
В этом случае zip должен создавать бесконечный список, однако лень позволяет Haskell создавать его только до (11,11)
: как вы видите, выполнение не расходится, но фактически дает нам правильный ответ.
Теперь позвольте мне рассмотреть еще одну проблему:
ghci> find_first_occurrence 1 [0, 0, 1 `div` 0, 1]
*** Exception: divide by zero
ghci> find_first_occurrence 1 [0, 1, 1 `div` 0, 0]
1
it :: Int
(0.02 secs, 1577136 bytes)
Поскольку весь сжатый список не построен, haskell, очевидно, не будет даже оценивать каждое выражение, встречающееся в списке, поэтому, когда элемент находится перед div 1 0
, функция корректно оценивается без возникновения исключений: деление на ноль не выполнялось происходят.