Explique esse pedaço de código haskell que gera um fluxo de primos

Eu tenho dificuldade em entender esse pedaço de código:

let
  sieve (p:xs) = p : sieve (filter (\ x -> x `mod` p /= 0) xs)
in sieve [2 .. ]

Alguém pode quebrar isso por mim? Eu entendo que há recursão nele, mas esse é o problema, não consigo entender como funciona a recursão neste exemplo.

questionAnswers(5)

yourAnswerToTheQuestion