Skip to content

Commit

Permalink
expected/expected: MonadicOperators調整(#1066)
Browse files Browse the repository at this point in the history
  • Loading branch information
yohhoy committed Feb 5, 2023
1 parent 7a5214d commit c7fe7e2
Show file tree
Hide file tree
Showing 4 changed files with 73 additions and 7 deletions.
16 changes: 16 additions & 0 deletions reference/expected/expected/and_then.md
Expand Up @@ -16,6 +16,18 @@ template<class F> constexpr auto and_then(F&& f) const &&; // (4)
正常値を保持していれば、正常値に対して`f`を適用した結果を`expected`として返す。
エラー値を保持していれば、そのまま返す。
実際には複数オーバーロードが提供されるが、大まかには下記シグニチャのようにみなせる。
`and_then`へは、引数リストに1個の`T`型をとり`std::expected<Return, E>`型を返す関数や関数オブジェクトを与える。
```cpp
template <class T, class E>
class expected {
template <class Return>
std::expected<Return, E> and_then(function<std::expected<Return, E>(T)> func);
};
```
* function[link /reference/functional/function.md]


## テンプレートパラメータ制約
- (1), (2) : [`is_copy_constructible_v`](/reference/type_traits/is_copy_constructible.md)`<E> == true`
Expand Down Expand Up @@ -62,6 +74,10 @@ template<class F> constexpr auto and_then(F&& f) const &&; // (4)
* std::move[link /reference/utility/move.md]


## 備考
`and_then`は、メソッドチェーンをサポートするモナド風(monadic)操作として導入された。


##
```cpp example
#include <cassert>
Expand Down
18 changes: 18 additions & 0 deletions reference/expected/expected/or_else.md
Expand Up @@ -16,6 +16,18 @@ template<class F> constexpr auto or_else(F&& f) const &&; // (4)
エラー値を保持していれば、エラー値に対して`f`を適用した結果を`expected`として返す。
正常値を保持していれば、そのまま返す。
実際には複数オーバーロードが提供されるが、大まかには下記シグニチャのようにみなせる。
`or_else`へは、引数リストに1個の`E`型をとり`std::expected<T, Return>`型を返す関数や関数オブジェクトを与える。
```cpp
template <class T, class E>
class expected {
template <class Return>
std::expected<T, Return> or_else(function<std::expected<T, Return>(E)> func);
};
```
* function[link /reference/functional/function.md]


## テンプレートパラメータ制約
- (1), (2) : [`is_copy_constructible_v`](/reference/type_traits/is_copy_constructible.md)`<T> == true`
Expand Down Expand Up @@ -62,6 +74,10 @@ template<class F> constexpr auto or_else(F&& f) const &&; // (4)
* std::move[link /reference/utility/move.md]


## 備考
`or_else`は、メソッドチェーンをサポートするモナド風(monadic)操作として導入された。


##
```cpp example
#include <cassert>
Expand Down Expand Up @@ -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]
### 出力
```
Expand Down
21 changes: 18 additions & 3 deletions reference/expected/expected/transform.md
Expand Up @@ -16,6 +16,18 @@ template<class F> constexpr auto transform(F&& f) const &&; // (4)
正常値を保持していれば、正常値に対して`f`を適用した結果を`expected`の正常値として格納して返す。
エラー値を保持していれば、そのまま返す。
実際には複数オーバーロードが提供されるが、大まかには下記シグニチャのようにみなせる。
`transform`へは、引数リストに1個の`T`型をとり`Return`型を返す関数や関数オブジェクトを与える。
```cpp
template <class T, class E>
class expected {
template <class Return>
std::expected<Return, E> transform(function<Return(T)> func);
};
```
* function[link /reference/functional/function.md]


## テンプレートパラメータ制約
- (1), (2) : [`is_copy_constructible_v`](/reference/type_traits/is_copy_constructible.md)`<E> == true`
Expand All @@ -25,24 +37,27 @@ template<class F> 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)`<F, decltype(`[`value()`](value.md)`)>>`としたとき、次を全て満たすこと
- `U``expected`の有効な正常値型である
- [`is_void_t`](/reference/type_traits/is_void.md)`<U> == false`のとき、宣言`U u(`[`invoke`](/reference/functional/invoke.md)`(`[`std::forward`](/reference/utility/forward.md)`<F>(f),` [`value()`](value.md)`));`が妥当である
- `U`が(CV修飾された)`void`ではないとき、宣言`U u(`[`invoke`](/reference/functional/invoke.md)`(`[`std::forward`](/reference/utility/forward.md)`<F>(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)`<F, decltype(`[`std::move`](/reference/utility/move.md)`(`[`value()`](value.md)`))>>`としたとき、次を全て満たすこと
- `U``expected`の有効な正常値型である
- [`is_void_t`](/reference/type_traits/is_void.md)`<U> == false`のとき、宣言`U u(`[`invoke`](/reference/functional/invoke.md)`(`[`std::forward`](/reference/utility/forward.md)`<F>(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>(f),` [`std::move`](/reference/utility/move.md)`(`[`value()`](value.md)`)));`が妥当である


## 効果
- (1), (2) : 次の効果をもつ
- エラー値を保持していたら、`expected<U, E>(`[`unexpect`](../unexpect_t.md)`,` [`error()`](error.md)`)`を返す。
-`U`が(CV修飾された)`void`でなければ、正常値を[`invoke`](/reference/functional/invoke.md)`(`[`std::forward`](/reference/utility/forward.md)`<F>(f),` [`value()`](value.md)`)`で非直接リスト初期化した`expected<U, E>`オブジェクトを返す。
- そうでなければ、[`invoke`](/reference/functional/invoke.md)`(`[`std::forward`](/reference/utility/forward.md)`<F>(f),` [`value()`](value.md)`)`を評価し、`expected<U, E>()`を返す。
- (3), (4) : 次の効果をもつ
- エラー値を保持していたら、`expected<U, E>(`[`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>(f),` [`std::move`](/reference/utility/move.md)`(`[`value()`](value.md)`))`で非直接リスト初期化した`expected<U, E>`オブジェクトを返す。
- そうでなければ、[`invoke`](/reference/functional/invoke.md)`(`[`std::forward`](/reference/utility/forward.md)`<F>(f),` [`std::move`](/reference/utility/move.md)`(`[`value()`](value.md)`))`を評価し、`expected<U, E>()`を返す。


## 備考
`transform`は、メソッドチェーンをサポートするモナド風(monadic)操作として導入された。


##
```cpp example
#include <cassert>
Expand Down
25 changes: 21 additions & 4 deletions reference/expected/expected/transform_error.md
Expand Up @@ -16,6 +16,18 @@ template<class F> constexpr auto transform_error(F&& f) const &&; // (4)
エラー値を保持していれば、エラー値に対して`f`を適用した結果を`expected`のエラー値として格納して返す。
正常値を保持していれば、そのまま返す。
実際には複数オーバーロードが提供されるが、大まかには下記シグニチャのようにみなせる。
`transform_error`へは、引数リストに1個の`E`型をとり`Return`型を返す関数や関数オブジェクトを与える。
```cpp
template <class T, class E>
class expected {
template <class Return>
std::expected<T, Return> transform_error(function<Return(E)> func);
};
```
* function[link /reference/functional/function.md]


## テンプレートパラメータ制約
- (1), (2) : [`is_copy_constructible_v`](/reference/type_traits/is_copy_constructible.md)`<T> == true`
Expand All @@ -24,10 +36,10 @@ template<class F> 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)`<F, decltype(`[`error()`](error.md)`)>>`としたとき、次を全て満たすこと
- `G`が`expected`の有効な値型である
- `G``expected`の有効なエラー値型である
- 宣言`G g(`[`invoke`](/reference/functional/invoke.md)`(`[`std::forward`](/reference/utility/forward.md)`<F>(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)`<F, decltype(`[`std::move`](/reference/utility/move.md)`(`[`error()`](error.md)`))>>`としたとき、次を全て満たすこと
- `G`が`expected`の有効な値型である
- `G``expected`の有効なエラー値型である
- 宣言`G g(`[`invoke`](/reference/functional/invoke.md)`(`[`std::forward`](/reference/utility/forward.md)`<F>(f),` [`std::move`](/reference/utility/move.md)`(`[`error()`](error.md)`)));`が妥当である


Expand All @@ -36,8 +48,12 @@ template<class F> constexpr auto transform_error(F&& f) const &&; // (4)
- 正常値を保持していたら、`expected<T, G>(`[`in_place`](/reference/utility/in_place_t.md)`,` [`value()`](value.md)`)`を返す。
- エラー値を[`invoke`](/reference/functional/invoke.md)`(`[`std::forward`](/reference/utility/forward.md)`<F>(f),` [`error()`](error.md)`)`で非直接リスト初期化した`expected<T, G>`オブジェクトを返す。
- (3), (4) : 次の効果をもつ
- エラー値を保持していたら、`expected<U, E>(`[`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>(f),` [`std::move`](/reference/utility/move.md)`(`[`error()`](error.md)`))`で非直接リスト初期化した`expected<T, G>`オブジェクトを返す。
- 正常値を保持していたら、`expected<T, G>(`[`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>(f),` [`std::move`](/reference/utility/move.md)`(`[`error()`](error.md)`))`で非直接リスト初期化した`expected<T, G>`オブジェクトを返す。


## 備考
`transform_error`は、メソッドチェーンをサポートするモナド風(monadic)操作として導入された。


##
Expand Down Expand Up @@ -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]
### 出力
```
Expand Down

0 comments on commit c7fe7e2

Please sign in to comment.