Метод size
не имеет ничего общего с тем фактом, что Option
также является монадой. Концепция monad
является довольно общей, она применима ко многим вещам, и все эти вещи, как правило, будут иметь гораздо больше методов, чем просто unit
и flatMap
. У Option
есть метод size
, потому что он неявно преобразуется через Option.option2iterable
в Iterable
. Это имеет смысл, поскольку Option
- это коллекция, содержащая не более одного элемента.
Я не вижу причин, по которым isDefined
должен "иметь больше смысла", чем size
. Ни один из этих методов не является строго необходимым. Фактически, все методы в Option
могут быть выражены только в fold
. Например, isDefined
может быть определено как
def isDefined = fold(false){ _ => true }
Аналогично, size
также может быть определено через fold
:
def size = fold(0){ _ => 1 }
Значит ли это, что мы должны выбросить все методы, кроме fold
? Нет, совсем нет. «Богатые интерфейсы», реализованные в виде черт, обеспечивающих множество производных методов, были, вероятно, главной причиной того, что коллекции Scala намного приятнее в использовании, чем, например, коллекции Java. К настоящему времени разница стала меньше, потому что Java также ввела реализации методов по умолчанию, которые делают нечто подобное, но это еще раз показывает, что богатые интерфейсы по своей сути полезны.