Aviso de isenção
Esta solução não é orientada a objetos, mas talvez ainda seja interessante.
TL; DR
Indo com a sua primeira ideia (se a atualização retornar uma lista de Organismos), em Haskell você pode
- defina um tipo
Organism
, - define uma função de atualização
update :: Organism -> [Organism]
, - faça um loop sobre uma lista
organism :: [Organism]
comorganisms >>= update
.
Resposta detalhada
No Haskell você pode modelar a função update
como uma função que produz uma lista de organismos:
data Organism = ...
update :: Organism -> [Organism]
Então a função update
pode produzir dois novos organismos e esquecer o antigo, ou repetir o antigo organismo seguido por seus filhos:
-- Parent disappears
update x = [child1 x, child2 x]
where
child1 x = ...
child2 x = ...
-- Parent followed by children
update x = [x, child1 x, child2 x]
where
child1 x = ...
child2 x = ...
Agora, sua iteração se resume a mapear a função update
sobre a lista inicial de organismos (que fornece uma lista de listas de organismos) e depois achatar o resultado usando concat
, assim
organisms = [..., ..., ]
newOrganisms = concat (map update organisms)
A combinação concat
- map
pode ser expressa por outra função chamada bind e escrita >>=
em Haskell (no Scala, ela é chamada flatMap
), então você também pode escrever:
organisms >>= update
Isso itera na lista, aplica update
a cada elemento e nivela o resultado.
Nota
Se você precisar de alguma informação sobre como experimentar esta solução em um interpretador Haskell, posso fornecer mais detalhes.