質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
関数型プログラミング

関数型プログラミングとは、関数を用いて演算子を構築し、算出し、コンピュータプログラムを構成する枠組みです。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

Q&A

0回答

409閲覧

fp-tsでTaskEither<E1, A | null>をTaskEither<E1 | E2, A>に変換するには

muuran

総合スコア0

関数型プログラミング

関数型プログラミングとは、関数を用いて演算子を構築し、算出し、コンピュータプログラムを構成する枠組みです。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

0グッド

0クリップ

投稿2022/04/17 14:32

現在、fp-tsを用いtry~catchを必要としないプログラム構成を勉強中です。

ORMによくあるfind関数のように、

  • IDに合致するものがあれば、エンティティオブジェクトを返す
  • IDに合致するものがなければ、nullを返す
  • DB接続エラー等が発生すればエラーをthrow

する関数があったとして、最終的にnullもしくは例外の時にleft、エンティティがあればrightを返すにはどのように実装すれば良いでしょうか?

find関数のイメージは以下です。

typescript

1async function find(id: number) { 2 if (id < 0) { 3 throw new IllegalArgumentException(); 4 } 5 if (id === 1) { 6 return { 7 foo: "bar" 8 }; 9 } else { 10 return null; 11 } 12}

例外をleftとして扱うために、TaskEither.tryCatch()を使いました。

typescript

1import * as TE from 'fp-ts/TaskEither'; 2 3TE.tryCatch(() => find(id), (e) => e); // TaskEither<IllegalArgumentException, object | null>

ここから、rightの値がnullの時にTaskEither<IllegalArgumentException | NotFoundException, object>のようにleft扱いにしたいと考えています。

pipe()chain()map()などを使うものと予想しましたが、どのように組み合わせるべきか分かりませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

muuran

2022/04/17 15:01

以下で求める変換はできましたが、正しいやり方なのかどうかわかっていません。 ```typescript pipe( TE.tryCatch(() => find(id), (e) => e), TE.chainW(result => result !== null ? TE.right(result) : TE.left(new NotFoundError()), ); ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問