dirty languages: input -> function_a -> output/input -> function_b -> output ^ ^ | | side_effect_a side_effect_b | | v v lovecraftian_primordial_soup_of_global_state pure languages: input -> function_a -> output/input -> function_b -> output ^ ^ | | side_effect_a side_effect_b ------> | +-------------------------------------------->
(output, side_effect_a) function_a(input); (output, side_effect_b) function_b(input);
(output, side_effect_b, side_effect_a) function_b(input, side_effect_a);
function_a() >>= function_b() >>= function_c >>= function_d