From c7fe7e269cffd85cbe741ba50482628f0840c716 Mon Sep 17 00:00:00 2001 From: yoh Date: Sun, 5 Feb 2023 11:16:16 +0900 Subject: [PATCH] =?UTF-8?q?expected/expected:=20MonadicOperators=E8=AA=BF?= =?UTF-8?q?=E6=95=B4(#1066)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- reference/expected/expected/and_then.md | 16 ++++++++++++ reference/expected/expected/or_else.md | 18 +++++++++++++ reference/expected/expected/transform.md | 21 +++++++++++++--- .../expected/expected/transform_error.md | 25 ++++++++++++++++--- 4 files changed, 73 insertions(+), 7 deletions(-) diff --git a/reference/expected/expected/and_then.md b/reference/expected/expected/and_then.md index 4f0062460..358fdfb1b 100644 --- a/reference/expected/expected/and_then.md +++ b/reference/expected/expected/and_then.md @@ -16,6 +16,18 @@ template constexpr auto and_then(F&& f) const &&; // (4) 正常値を保持していれば、正常値に対して`f`を適用した結果を`expected`として返す。 エラー値を保持していれば、そのまま返す。 +実際には複数オーバーロードが提供されるが、大まかには下記シグニチャのようにみなせる。 +`and_then`へは、引数リストに1個の`T`型をとり`std::expected`型を返す関数や関数オブジェクトを与える。 + +```cpp +template +class expected { + template + std::expected and_then(function(T)> func); +}; +``` +* function[link /reference/functional/function.md] + ## テンプレートパラメータ制約 - (1), (2) : [`is_copy_constructible_v`](/reference/type_traits/is_copy_constructible.md)` == true` @@ -62,6 +74,10 @@ template constexpr auto and_then(F&& f) const &&; // (4) * std::move[link /reference/utility/move.md] +## 備考 +`and_then`は、メソッドチェーンをサポートするモナド風(monadic)操作として導入された。 + + ## 例 ```cpp example #include diff --git a/reference/expected/expected/or_else.md b/reference/expected/expected/or_else.md index 9cac72496..8c7b08d78 100644 --- a/reference/expected/expected/or_else.md +++ b/reference/expected/expected/or_else.md @@ -16,6 +16,18 @@ template constexpr auto or_else(F&& f) const &&; // (4) エラー値を保持していれば、エラー値に対して`f`を適用した結果を`expected`として返す。 正常値を保持していれば、そのまま返す。 +実際には複数オーバーロードが提供されるが、大まかには下記シグニチャのようにみなせる。 +`or_else`へは、引数リストに1個の`E`型をとり`std::expected`型を返す関数や関数オブジェクトを与える。 + +```cpp +template +class expected { + template + std::expected or_else(function(E)> func); +}; +``` +* function[link /reference/functional/function.md] + ## テンプレートパラメータ制約 - (1), (2) : [`is_copy_constructible_v`](/reference/type_traits/is_copy_constructible.md)` == true` @@ -62,6 +74,10 @@ template constexpr auto or_else(F&& f) const &&; // (4) * std::move[link /reference/utility/move.md] +## 備考 +`or_else`は、メソッドチェーンをサポートするモナド風(monadic)操作として導入された。 + + ## 例 ```cpp example #include @@ -98,6 +114,8 @@ int main() * value()[link value.md] * error()[link error.md] * std::unexpected[link ../unexpected.md] +* std::from_chars[link /reference/charconv/from_chars.md] +* std::errc[link /reference/system_error/errc.md] ### 出力 ``` diff --git a/reference/expected/expected/transform.md b/reference/expected/expected/transform.md index 13f65dfbd..74439250d 100644 --- a/reference/expected/expected/transform.md +++ b/reference/expected/expected/transform.md @@ -16,6 +16,18 @@ template constexpr auto transform(F&& f) const &&; // (4) 正常値を保持していれば、正常値に対して`f`を適用した結果を`expected`の正常値として格納して返す。 エラー値を保持していれば、そのまま返す。 +実際には複数オーバーロードが提供されるが、大まかには下記シグニチャのようにみなせる。 +`transform`へは、引数リストに1個の`T`型をとり`Return`型を返す関数や関数オブジェクトを与える。 + +```cpp +template +class expected { + template + std::expected transform(function func); +}; +``` +* function[link /reference/functional/function.md] + ## テンプレートパラメータ制約 - (1), (2) : [`is_copy_constructible_v`](/reference/type_traits/is_copy_constructible.md)` == true` @@ -25,10 +37,10 @@ template constexpr auto transform(F&& f) const &&; // (4) ## 適格要件 - (1), (2) : 型`U`を[`remove_cvref_t`](/reference/type_traits/remove_cvref.md)`<`[`invoke_result_t`](/reference/type_traits/invoke_result.md)`>`としたとき、次を全て満たすこと - `U`が`expected`の有効な正常値型である - - [`is_void_t`](/reference/type_traits/is_void.md)` == false`のとき、宣言`U u(`[`invoke`](/reference/functional/invoke.md)`(`[`std::forward`](/reference/utility/forward.md)`(f),` [`value()`](value.md)`));`が妥当である + - `U`が(CV修飾された)`void`ではないとき、宣言`U u(`[`invoke`](/reference/functional/invoke.md)`(`[`std::forward`](/reference/utility/forward.md)`(f),` [`value()`](value.md)`));`が妥当である - (3), (4) : 型`U`を[`remove_cvref_t`](/reference/type_traits/remove_cvref.md)`<`[`invoke_result_t`](/reference/type_traits/invoke_result.md)`>`としたとき、次を全て満たすこと - `U`が`expected`の有効な正常値型である - - [`is_void_t`](/reference/type_traits/is_void.md)` == false`のとき、宣言`U u(`[`invoke`](/reference/functional/invoke.md)`(`[`std::forward`](/reference/utility/forward.md)`(f),` [`std::move`](/reference/utility/move.md)`(`[`value()`](value.md)`)));`が妥当である + - `U`が(CV修飾された)`void`ではないとき、宣言`U u(`[`invoke`](/reference/functional/invoke.md)`(`[`std::forward`](/reference/utility/forward.md)`(f),` [`std::move`](/reference/utility/move.md)`(`[`value()`](value.md)`)));`が妥当である ## 効果 @@ -36,13 +48,16 @@ template constexpr auto transform(F&& f) const &&; // (4) - エラー値を保持していたら、`expected(`[`unexpect`](../unexpect_t.md)`,` [`error()`](error.md)`)`を返す。 - 型`U`が(CV修飾された)`void`でなければ、正常値を[`invoke`](/reference/functional/invoke.md)`(`[`std::forward`](/reference/utility/forward.md)`(f),` [`value()`](value.md)`)`で非直接リスト初期化した`expected`オブジェクトを返す。 - そうでなければ、[`invoke`](/reference/functional/invoke.md)`(`[`std::forward`](/reference/utility/forward.md)`(f),` [`value()`](value.md)`)`を評価し、`expected()`を返す。 - - (3), (4) : 次の効果をもつ - エラー値を保持していたら、`expected(`[`unexpect`](../unexpect_t.md)`,` [`std::move`](/reference/utility/move.md)`(`[`error()`](error.md)`))`を返す。 - 型`U`が(CV修飾された)`void`でなければ、正常値を[`invoke`](/reference/functional/invoke.md)`(`[`std::forward`](/reference/utility/forward.md)`(f),` [`std::move`](/reference/utility/move.md)`(`[`value()`](value.md)`))`で非直接リスト初期化した`expected`オブジェクトを返す。 - そうでなければ、[`invoke`](/reference/functional/invoke.md)`(`[`std::forward`](/reference/utility/forward.md)`(f),` [`std::move`](/reference/utility/move.md)`(`[`value()`](value.md)`))`を評価し、`expected()`を返す。 +## 備考 +`transform`は、メソッドチェーンをサポートするモナド風(monadic)操作として導入された。 + + ## 例 ```cpp example #include diff --git a/reference/expected/expected/transform_error.md b/reference/expected/expected/transform_error.md index 160c97d4b..100e135d1 100644 --- a/reference/expected/expected/transform_error.md +++ b/reference/expected/expected/transform_error.md @@ -16,6 +16,18 @@ template constexpr auto transform_error(F&& f) const &&; // (4) エラー値を保持していれば、エラー値に対して`f`を適用した結果を`expected`のエラー値として格納して返す。 正常値を保持していれば、そのまま返す。 +実際には複数オーバーロードが提供されるが、大まかには下記シグニチャのようにみなせる。 +`transform_error`へは、引数リストに1個の`E`型をとり`Return`型を返す関数や関数オブジェクトを与える。 + +```cpp +template +class expected { + template + std::expected transform_error(function func); +}; +``` +* function[link /reference/functional/function.md] + ## テンプレートパラメータ制約 - (1), (2) : [`is_copy_constructible_v`](/reference/type_traits/is_copy_constructible.md)` == true` @@ -24,10 +36,10 @@ template constexpr auto transform_error(F&& f) const &&; // (4) ## 適格要件 - (1), (2) : 型`G`を[`remove_cvref_t`](/reference/type_traits/remove_cvref.md)`<`[`invoke_result_t`](/reference/type_traits/invoke_result.md)`>`としたとき、次を全て満たすこと - - `G`が`expected`の有効な値型である + - `G`が`expected`の有効なエラー値型である - 宣言`G g(`[`invoke`](/reference/functional/invoke.md)`(`[`std::forward`](/reference/utility/forward.md)`(f),` [`error()`](error.md)`));`が妥当である - (3), (4) : 型`G`を[`remove_cvref_t`](/reference/type_traits/remove_cvref.md)`<`[`invoke_result_t`](/reference/type_traits/invoke_result.md)`>`としたとき、次を全て満たすこと - - `G`が`expected`の有効な値型である + - `G`が`expected`の有効なエラー値型である - 宣言`G g(`[`invoke`](/reference/functional/invoke.md)`(`[`std::forward`](/reference/utility/forward.md)`(f),` [`std::move`](/reference/utility/move.md)`(`[`error()`](error.md)`)));`が妥当である @@ -36,8 +48,12 @@ template constexpr auto transform_error(F&& f) const &&; // (4) - 正常値を保持していたら、`expected(`[`in_place`](/reference/utility/in_place_t.md)`,` [`value()`](value.md)`)`を返す。 - エラー値を[`invoke`](/reference/functional/invoke.md)`(`[`std::forward`](/reference/utility/forward.md)`(f),` [`error()`](error.md)`)`で非直接リスト初期化した`expected`オブジェクトを返す。 - (3), (4) : 次の効果をもつ - - エラー値を保持していたら、`expected(`[`unexpect`](../unexpect_t.md)`,` [`std::move`](/reference/utility/move.md)`(`[`error()`](error.md)`))`を返す。 - - 正常値を[`invoke`](/reference/functional/invoke.md)`(`[`std::forward`](/reference/utility/forward.md)`(f),` [`std::move`](/reference/utility/move.md)`(`[`error()`](error.md)`))`で非直接リスト初期化した`expected`オブジェクトを返す。 + - 正常値を保持していたら、`expected(`[`in_place`](/reference/utility/in_place_t.md)`,` [`std::move`](/reference/utility/move.md)`(`[`value()`](value.md)`))`を返す。 + - エラー値を[`invoke`](/reference/functional/invoke.md)`(`[`std::forward`](/reference/utility/forward.md)`(f),` [`std::move`](/reference/utility/move.md)`(`[`error()`](error.md)`))`で非直接リスト初期化した`expected`オブジェクトを返す。 + + +## 備考 +`transform_error`は、メソッドチェーンをサポートするモナド風(monadic)操作として導入された。 ## 例 @@ -67,6 +83,7 @@ int main() * value()[link value.md] * error()[link error.md] * std::unexpected[link ../unexpected.md] +* std::reverse[link /reference/algorithm/reverse.md] ### 出力 ```