Изучая Scala Вам рано или поздно придётся столкнуться с довольно специфичной темой, без которой дальше продвигаться не представляется возможным. Монады - что это за блюдо, и с чем их едят? Как мне кажется, проще всего их можно описать одним словом - контейнер. Контейнер, несущий в себе значение переменной, массива, объекта, да всего чего угодно, но как обычно, всегда есть одно НО... Честно говоря, "но" не одно, а целых три - это основоположные законы монады, эдакий "контракт", который они обязуются выполнять, т.к. монаду может запилить кто угодно - надо чтобы они были в чём-то похожи, верно? Начнём с того, что у каждой монады в скале есть метод создания монады и метод flatMap, рассмотрим его: flatMap() сам по себе, как метод, появился из двух различных методов - map() и flatten(). map() - это метод применения какой-либо функции к содержимому, а flatten() - метод "устранения" излишней вложенности. В общем, если у вас есть двойной массив [][] - то после flatten() останется один, содержащ