Итак, я пишу программу для создания списка простых чисел в haskell. Я создаю две функции, приведенные ниже:Бесконечная петля в haskell
{-
Given a list of prime numbers, this function will
add the next prime number to the list. So, given the
list [2, 3], it will return [2, 3, 5]
-}
nextPrime xs = xs ++ [lastVal + nextCounts]
where
lastVal = (head . reverse) $ xs
isNextPrime y = 0 `elem` (map (y `mod`) xs)
nextVals = (map isNextPrime [lastVal, lastVal+1 ..])
nextCounts = length $ takeWhile (\x -> x) nextVals
allPrimes xs = allPrimes np
where
np = nextPrime xs
Теперь функция nextPrime выполняет то, что она должна делать. Однако, когда я звоню на allPrimes, как показано ниже:
take 5 $ allPrimes [2,3]
Программа переходит в бесконечный цикл. Я думал, что Haskells «ленивые» функции должны были заботиться обо всем этом? Что мне не хватает?
Вопрос: Когда allPrimes производит первое значение? Анс: Никогда. Он просто называет это я с большим списком, и этот шаг никогда не заканчивается. Тривиальным решением является получение некоторого результата до повторного повторения. – Satvik
Я бы предложил вместо написания функции, которая берет список, а затем возвращает новый список со следующим простом, почему бы просто не сделать функцию, которая создает бесконечный список простых чисел? Haskell использует ленивую оценку, поэтому вы просто вычисляете элемент списка, когда вы его запрашиваете. – bheklilr