Para começar, temos a bela definição
x = 1 : map (2*) x
o que por si só é um pouco alucinante, se você nunca viu antes. De qualquer forma, é um truque bastante comum de preguiça e recursão. Agora, vamos nos livrar da recursão explícita usando fixe point-free-ify.
x = fix (\vs -> 1 : map (2*) vs)
x = fix ((1:) . map (2*))
A próxima coisa que vamos fazer é expandir a :seção e tornar o mapdesnecessariamente complexo.
x = fix ((:) 1 . (map . (*) . (*2)) 1)
Bem, agora temos duas cópias dessa constante 1. Isso nunca vai funcionar, então usaremos o aplicativo do leitor para eliminar a duplicação. Além disso, a composição de funções é um pouco lixo, então vamos substituí-la (<$>)sempre que pudermos.
x = fix (liftA2 (.) (:) (map . (*) . (*2)) 1)
x = fix (((.) <$> (:) <*> (map . (*) . (*2))) 1)
x = fix (((<$>) <$> (:) <*> (map <$> (*) <$> (*2))) 1)
A seguir: essa chamada para mapé muito legível. Mas não há nada a temer: podemos usar as leis da mônada para expandi-lo um pouco. Em particular fmap f x = x >>= return . f, então
map f x = x >>= return . f
map f x = ((:[]) <$> f) =<< x
Podemos apontar livremente, substituir (.)por (<$>)e, em seguida, adicionar algumas seções espúrias:
map = (=<<) . ((:[]) <$>)
map = (=<<) <$> ((:[]) <$>)
map = (<$> ((:[]) <$>)) (=<<)
Substituindo esta equação em nossa etapa anterior:
x = fix (((<$>) <$> (:) <*> ((<$> ((:[]) <$>)) (=<<) <$> (*) <$> (*2))) 1)
Finalmente, você quebra a barra de espaço e produz a maravilhosa equação final
x=fix(((<$>)<$>(:)<*>((<$>((:[])<$>))(=<<)<$>(*)<$>(*2)))1)