Java-опционально против C ++ - опционально - PullRequest
1 голос
/ 03 ноября 2019

Прав ли я, предполагая, что Java- Optional не имеет особых задач с C ++ 17- optional?

Я знаю Javas Optional в основном из использования в Stream-API, например:

Optional<Integer> op  = Optional.empty(); 
op.stream().forEach(System.out::println); 

Я знаю, что он также используется как возвращаемое значение (не столько как параметр). Но в отношении такого рода использования это не относится к C ++ - optional, верно?

Или, опять же, " Monads ", вещь, которую никто не может объяснить, поняв это? Имеет ли C ++ - optional на самом деле все, что связано с монадами, и поэтому имеет Java-Streams, и, следовательно, C ++ - -optional сравним с Java- Optional? Тогда что будет сравнимым примером?

Ответы [ 2 ]

1 голос
/ 03 ноября 2019

Прав ли я, если предположить, что Java-Optional не имеет большого количества дел с C ++ 17-Optional?

Они похожи в том, что они типа модели одинаковыПонятие - это значение, которое может отсутствовать, но их интерфейсы очень разные. Я не очень разбираюсь в C ++, но, глядя на эту страницу , я вижу, что std::optional в C ++ намного менее функциональный , чем Optional.

* 1012 в Java. *

Или это снова «Монады», то, что никто не может объяснить, поняв это?

Найди дальше! Optional в Java по сути является монадой. Имея методы Optional.of и Optional.flatMap, Java Optional становится монадой. В необязательном C ++ отсутствует соответствующий метод flatMap, из-за чего он не является монадой :(

IMO, std::optional не имеющий метода flatMap является фундаментальным для двух рассматриваемых типов. flatMap имеет подпись:

<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper)

По существу позволяет составлять Optional с. Вы можете иметь Optional<String>, применить функцию, которая возвращает еще один Optional<T>, а затем верните Optional<T>.

Вот статья о монадах, которая может помочь. Монады не так уж и страшны. Ключевая особенность - это функция с такой же сигнатуройкак flatMap показано выше. Если вы видите что-то подобное, есть большая вероятность, что вы нашли монаду! Stream, следовательно, является монадой.

1 голос
/ 03 ноября 2019

Необязательные в Java и в C ++ (и во многих других языках программирования) служат аналогичной цели - для представления значения, которое может присутствовать или отсутствовать.

Необязательные в Java используются не только для потоковони могут (и должны) использоваться самостоятельно. При этом в Java необязательные параметры следует использовать только в качестве возвращаемых типов методов, которые могут возвращать или не возвращать значение. То же самое может быть достигнуто с помощью возврата null значений, но при этом гораздо проще забыть проверить возвращаемое значение. Но дополнительные функции в Java не должны просто заменять каждый объект, который может фактически отсутствовать (например, Maybe в Haskell).

Я не эксперт в C ++, но похоже,optional в C ++ имеет в основном ту же цель (поправьте меня, если я ошибаюсь).

Я не буду объяснять, что такое монады, но концепция довольно проста, и я действительно не знаю, почему такмногие их боятся. Если вы читали что-нибудь о монадах, вы знаете, что они в основном имеют 2 операции: создать монадическое значение и связать его (или отобразить на карте).

В Java Optional.of создает необязательное значениеи Optional.flatMap, ну, плоские карты это. Но эти операции не в полной мере соблюдают монадические законы, поэтому пуристы утверждают, что опционы в Java не являются на самом деле монадами.

В C ++ вы можете создать опциональный объект с помощью конструктора или make_optional функция, так что у вас есть операция создания. Но я не могу найти функцию bind или flat_map в стандартной библиотеке. Если вы хотите, вы можете написать один самостоятельно - тогда, если эта функция уважает монадические законы, опциональная станет монадой.

...