Как бы вы (пере) реализовали итерацию в Haskell?

iterate :: (a -> a) -> a -> [a]

(Как вы наверное знаете)iterate это функция, которая принимает функцию и начальное значение. Затем он применяет функцию к начальному значению, затем он применяет ту же функцию к последнему результату и так далее.

Prelude> take 5 $ iterate (^2) 2
[2,4,16,256,65536]
Prelude> 

Результатом является бесконечный список. (вот почему я используюtake). Мой вопрос, как бы вы реализовали свойiterate' функция в Haskell, используя только основы ((:) (++) лямбды, выкройки, охранники и т. д.)?

(Начинающий Хаскель здесь)