Java可选与C ++可选

问题描述 投票:0回答:2

我是否认为Java- Optional与C ++ 17- optional没有太多关系?

我知道Java Optional主要是通过在Stream-API中使用,例如:

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

我知道它也有作为返回值的用途(与其说是参数,不如说是它的用途)。但是关于这种用法,这不适用于C ++-optional,对吧?

还是还是“ Monads”,没有人能在理解后解释一下? C ++-optional是否实际上与Monads都有关系,Java-Streams也是如此,因此C ++--optional与Java- Optional相当吗?那么,什么是可比的例子?

java c++ stream monads optional
2个回答
0
投票

[Java和C ++(以及许多其他编程语言)中的可选对象具有相似的目的-表示可能存在或不存在的值。

Java中的可选参数不仅用于流,还可以(并且应该)单独使用它们。话虽这么说,在Java中,可选参数仅应用作可能返回或可能不返回值的方法的返回类型。返回null值可以实现相同的目的,但是忘记检查返回的值会容易得多。但是,Java中的可选对象不应该只是替换实际上可能不存在的每个对象(例如,例如Haskell中的Maybe)。

我不是C ++专家,但看起来C ++的optional具有大致相同的目的(如果我错了,请纠正我)。

我不会解释这里的单子,但是这个概念很简单,我真的不知道为什么这么多人害怕它们。如果您已经阅读了有关monad的任何内容,则知道它们基本上有2种操作:创建monadic值并将其绑定(或平面映射)。

在Java中,Optional.of创建一个可选值,然后Optional.flatMap对其进行平面映射。但是这些操作没有完全遵守单子法则,因此纯粹主义者声称Java中的可选不是really单子法。

在C ++中,您可以使用构造函数或make_optional函数创建一个可选的,因此您可以进行创建操作。但是我在标准库中找不到bindflat_map函数。如果愿意,您可以自己编写-如果该功能符合单子法则,则可选将成为单子法。


0
投票

我是否认为Java-Optional与C ++ 17-Optional没有太多关系?

它们的相似之处在于,它们为相同的概念建模—可能不存在该值,但是它们的界面却大不相同。我对C ++不太了解,但是从this page来看,我可以看到C ++的std::optional比Java的Optional少了很多。

或者还是“ Monads”,没有人能在理解后解释一下?

现货! Java的Optional本质上是monad。通过具有Optional.ofOptional.flatMap方法,Java Optional成为monad。 C ++可选缺少相应的flatMap方法,这导致它不是monad :(

IMO,std::optional没有flatMap方法是这两种类型之间的基础。 flatMap具有签名:

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

基本上允许您

组成

Optional秒。您可以拥有一个Optional<String>,应用一个函数来返回另一个Optional<T>,然后再获取一个Optional<T>
这里是有关Monad的paper,可能会有所帮助。
© www.soinside.com 2019 - 2024. All rights reserved.