Итак, я пытаюсь научить себя Хаскелу. Я сейчас на 11-й главе Учите вас Haskell для Great Good, и я делаю 99 Haskell Problems, а также Project Euler Problems.
Все идет хорошо, но я постоянно делаю что-то, когда мне нужно отслеживать "переменные". Я просто создаю еще одну функцию, которая принимает эти "переменные" в качестве параметров и рекурсивно подает разные значения в зависимости от ситуации. Чтобы проиллюстрировать на примере, здесь мое решение Проблема 7 Project Euler, найдите 10001st prime:
answer :: Integer
answer = nthPrime 10001
nthPrime :: Integer -> Integer
nthPrime n
| n < 1 = -1
| otherwise = nthPrime' n 1 2 []
nthPrime' :: Integer -> Integer -> Integer -> [Integer] -> Integer
nthPrime' n currentIndex possiblePrime previousPrimes
| isFactorOfAnyInThisList possiblePrime previousPrimes = nthPrime' n currentIndex theNextPossiblePrime previousPrimes
| otherwise =
if currentIndex == n
then possiblePrime
else nthPrime' n currentIndexPlusOne theNextPossiblePrime previousPrimesPlusCurrentPrime
where currentIndexPlusOne = currentIndex + 1
theNextPossiblePrime = nextPossiblePrime possiblePrime
previousPrimesPlusCurrentPrime = possiblePrime : previousPrimes
Я думаю, вы поняли. Позвольте также просто игнорировать тот факт, что это решение может быть сделано более эффективным, я знаю об этом.
Итак, мой вопрос - это вопрос двух частей. Во-первых, я все-таки обманываю Haskell? Я застрял в императивном мышлении программирования и не обнимаю Haskell, как должен? И если так, как я себя чувствую, как избежать этого? Есть ли книга или источник, на которые вы можете указать мне, что может помочь мне подумать больше о Haskell?
Ваша помощь очень ценится,
-Asaf