Explique este fragmento de código de haskell que genera una secuencia de números primos.

Tengo problemas para entender este trozo de código:

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

¿Puede alguien descomponerlo por mí? Entiendo que hay recursión en eso, pero ese es el problema que no puedo entender cómo funciona la recursión en este ejemplo.