Я собираю конкретную задачу, чтобы проиллюстрировать, о чем я говорил
Скажем, я хотел найти сумму всех факторов большого числа наивно - путем проверки каждого числа под ним, если это был фактор, затем сложение их вместе.
На императивном языке программирования без разделения между IO и чистыми вычислениями вы можете сделать что-то вроде этого
def sum_of_factors(n):
sum = 0
for i between 1 and n:
if (n % i == 0):
sum += i
return sum
Однако, если мой n
большой, я бы долго смотрел на пустой экран, прежде чем вычисление закончится. Поэтому я добавляю некоторые записи -
def sum_of_factors(n):
sum = 0
for i between 1 and n:
if (i % 1000 == 0):
print "checking $i..."
if (n % i == 0):
print "found factor $i"
sum += 1
return sum
и действительно, это добавление тривиально.
Теперь, если бы я сделал это в учебнике haskell, я мог бы сделать
sum_of_factors :: Int -> Int
sum_of_factors n = foldl' (+) 0 factors
where
factors = filter ((== 0) . (mod n)) [1..n]
Я столкнулся с той же проблемой, что и раньше... для больших чисел я просто смотрю на пустой экран некоторое время.
Но я не могу понять, как вводить такой же трассировки/протоколирования в код Haskell. я не уверен, кроме, возможно, повторного внедрения fold с явной рекурсией, чтобы получить тот же шаблон трассировки/результат, что и в императивном нечистом коде.
Есть ли в Haskell факультет, чтобы сделать это выполнимым? Тот, который не требует рефакторинга всего?
Спасибо