I'd like to mention an important distinction:
cyclic' = [0,1] ++ cyclic'
cyclic'' = [0,1] ++ x
where x = cyclic''
These two functions are recursive. But
cyclic = let x = 0 : y
y = 1 : x
in x
is not! It uses x
internally, which is recursive, but the whole cyclic
isn't. This is also why they're different when compiled into the core language.
This has some important practical implications, namely that recursive functions can't be inlined, but non-recursive can.