Seja um conjunto A = {a,b,c} e R uma relação em A onde R = {(a,b), (b,c)}, o fecho transitivo deve conter a tupla (a,c), uma vez que (a,b) e (b,c) pertencem à R, então, por transitividade, (a,c) deve estar na nova relação: R+ = {(a,b),(b,c),(a,c)} Já o fecho reflexivo de R resulta em {(a,b),(b,c),(a,a),(b,b),(c,c)} O fecho transitivo-reflexivo será {(a,b),(b,c),(a,c),(a,a),(b,b),(c,c)}
Já a função flatten, o exemplo é o seguinte: seja A uma lista A=[1,[2,[3,[4]]]], flatten(A) = [1,2,3,4] (obs. não importando a profundidade do aninhamento das listas, a função deve sempre retornar uma lista plana)
flatten é um caso especial de flatmap, que recebe uma lista a ser planificada e uma função que será aplicada em cada um dos elementos. flatten portanto é (flatmap identity lista) onde identity(x) = x Ps. flatMap faz parte da interface das Mônadas ou Monads. Simplificando, se algo é flatmappable, então ele certamente é um Monad.