свои наблюдения:
1. использую >>= вместо concatMap или join $ fmap f
2. редко использую do-нотацию для списков
3. если можно использовать do-нотацию, то почему-бы не использовать list-comprehension?
4. если бы задача была именно семантически работать в монаде нон-детерменированности, когда у меня куча разных вариантов, и они порождают новые варианты, то я бы использовал do-нотацию