C++23添加了一些关于选项的“一元式”功能,作为optional<T>的方法。
optional::and_then() (忽略this的限定符):
模板自动and_then(F& f);
返回对包含的值调用f的结果(如果存在)。否则,返回返回类型的空值。
optional::transform() (忽略this的限定符):
模板自动变换(F& f);
返回一个std::optional,如果f包含一个值,则该结果包含对包含的值调用f的结果。否则,返回此类类型的空std::optional。
那么,这两个函数不是在做相同的事情吗?
发布于 2022-11-26 19:32:28
and_then是一元bind,flatmap是>>=,transform是函数式map。
我们可以泛化地用map来表达bind,但不能用相反的方式来表达,因为函子不一定是单变量。当然,特定的std::optional单体可以随时打开,因此这两个函数都可以用普通的预C++23 std::optional API表示。因此,C++标准为什么定义这两个函数的问题并不比它为什么定义这两个函数的问题更好。也许标准希望独立地给程序员一个标准的函数接口和一个标准的一元接口。任何一个接口本身都是有用和重要的。
发布于 2022-11-27 07:35:06
and_then只接受T -> std::optional<U>类型的函数(而transform可以接受返回任何类型的函数)。
如果您只是使用这样一个函数的transform,您将得到一个std::optional<std::optional<U>>。
然后,and_then将std::optional<std::optional<U>>压缩成一个std::optional<U>。
这就是所有的单变量:由类型级别的transform组成的flatten。想想range<range<U>>和future<future<U>>。
https://stackoverflow.com/questions/74581060
复制相似问题