Как можно использовать (Monad) Option.size в Scala - PullRequest
0 голосов
/ 17 мая 2018

Когда мы делаем Some («некоторые значения»). Size возвращает 1. Когда мы делаем None.size, он возвращает 0. Мне было интересно, что может быть возможным использованием метода размера в опции.

val x = Some(1,2,3,4).size
println(x) // prints 1
val y = Some(List(“a”, ”b”, ”c”, ”d”))
println(y) //it also print 1

Когда мы собираемся иметь 1 для любого вида значения внутри Some и 0 для None. Какая польза от этого метода размера по сравнению с Option.

Одно из возможных применений, о которых я могу подумать, - это узнать, определен ли параметр в случае (Some) и размер равен 1 или нет, когда None и size равен 0.

Но это не имеет смысла, потому что у нас уже есть isDefined, чтобы проверить это.

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Метод 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 также ввела реализации методов по умолчанию, которые делают нечто подобное, но это еще раз показывает, что богатые интерфейсы по своей сути полезны.

0 голосов
/ 17 мая 2018

Добавлен метод size, поскольку Options неявно преобразуются в Iterable .Iterable предоставляет тонну полезных методов без необходимости переопределения для Options.Повторно используя этот код, Options получает согласованность со всеми остальными контейнерами и гораздо более пригодны для повторного использования.

Другими словами, он позволяет передать Option в функцию, ожидающую Iterable, гдеэта функция знает только о таких методах, как size, а не о Option -специфических методах, таких как isDefined.

Действительно, isDefined - это метод, который вам не нужен строго, поскольку он имеет смысл только дляузкий Option тип.Это просто, чтобы предоставить семантически более хорошее имя, чем size или isEmpty.

...