А вот у меня тут возник дурацкий вопрос. У меня есть некоторая функция, которая ищет разные варианты работы со стейтом. То есть f :: [State World ()]. Внутри есть несколько вариантов ветвления и исходя из этого получается дерево разных конечных результатов. Но некоторые действия являются независимыми и "сделать а, потом сделать б" приводит к ровно тому же результату, что и наоборот. То есть я хочу чтобы у меня реально разветвленные вычисления сливались обратно, если стейт оказывается одинаковым. Это надо самому садиться и реализовывать instance Monad для такой моей конструкции?