primeFactors
только когда-либо читает до квадратного корня числа, которое он оценивает. Он никогда не смотрит дальше в списке, что означает, что он никогда не «догоняет» число, которое он тестирует для включения в список. Поскольку Haskell ленив, это означает, что тест primeFactors
завершается.
Другая вещь, которую следует помнить, это то, что primes
- это не функция, которая оценивает список при каждом обращении к нему, а список, который создается лениво. Таким образом, после того, как к 15-му элементу был получен доступ один раз, второй доступ к нему становится «бесплатным» (например, он не требует каких-либо дополнительных вычислений).