List definitions:

data List a = Cons a (List a) | Nil


Stream definitions:

data Stream a = forall s. Stream (s -> Step a s) s -- ^ Note the existential quantification here
-- We do not care about the type of the underlying state
-- Only that it gives us values of type a
data Step a s = Done
| Yield a s
| Skip s


Recognize the similarities between Stream data constructor and unfoldr

Stream  :: forall s a. (s -> Step a, s)    -> s -> Stream a
unfoldr :: forall s a. (s -> Maybe (a, s)) -> s -> [a]

Stream is not a recursive structure. You can see both map and fromList definitions for intuition:

map :: (a -> b) -> Stream a -> Stream b
map f (Stream next s) = Stream next' s
where
next s = case next of
Done -> Done
Skip s' -> Skip
Yield x s' -> Yield (f x) s'

fromList :: [a] -> Stream a
fromList ls = Stream next xs
where
next [] = Done
next (x:xs) = Yield x xs


Conversion to list is efficient as well since Haskell is lazy:

toList :: Stream a -> [a]
toList (Stream next s) = unfold s
where
unfold s1 = case next s of
Done -> []
Skip s' -> unfold s' -- Thunk'd
Yield x s' -> x : unfold s' -- Thunk'd


Usecases for streams: