【Haskell学習|初心者向け】エラーの「理由」を捨ててシンプルに!EitherからMaybeへの変換テクニック

1. 導入:なぜエラーの「理由」を捨てる必要があるのか?

関数型プログラミングでは、失敗する可能性のある処理を「Either型」を使って表現するのが一般的です。Eitherは成功時に「値」、失敗時に「エラー理由(メッセージなど)」を保持できます。しかし、プログラムの境界線では、「エラーの詳細は不要で、単に値が存在するかどうかだけを知りたい」という場面に遭遇します。この変換を適切に行うことで、インターフェースをシンプルに保ち、呼び出し側のコードをスッキリさせることができます。

2. 基礎知識:EitherとMaybeの違い

まずは2つの型の役割を整理しましょう。
Either a b は、「成功ならb、失敗ならa」という二面性を持っています。エラーの理由を追いかけたい内部処理に向いています。
一方、Maybe a は、「値がある(Just a)」か「何もない(Nothing)」かの二択です。処理の成功・失敗のみが重要な場面で非常に扱いやすい型です。
「エラーの理由は内部で解決済みなので、外部には結果の有無だけを返したい」という際に、この変換が威力を発揮します。

3. 実装と解決策:hush関数の活用

EitherをMaybeに変換する最もスマートな方法は、「hush」という関数を利用することです。これは多くの関数型言語のライブラリ(Haskellのerrorsパッケージなど)で提供されていますが、自分で実装するのも簡単です。論理的には「成功(Right)なら値を取り出し、失敗(Left)ならNothingを返す」という変換を行います。

4. サンプルプログラム

以下は、EitherからMaybeへ変換する処理の例です。

// 失敗の理由を持つEither型の値
const result = { type: ‘left’, error: ‘データベース接続エラー’ };

// EitherをMaybe(値の有無)に変換する関数
// RightならJust(値)、LeftならNothingを返す
const hush = (either) => {
if (either.type === ‘right’) {
return { type: ‘just’, value: either.value };
}
return { type: ‘nothing’ };
};

// 実行例
const maybeResult = hush({ type: ‘right’, value: 42 });

if (maybeResult.type === ‘just’) {
console.log(‘値が取得できました:’, maybeResult.value);
} else {
console.log(‘値はありませんでした’);
}

5. 応用・注意点:境界線を見極める

このテクニックを使う際の注意点は、「エラー情報の破棄」です。変換した瞬間に「なぜ失敗したか」という情報は消滅します。そのため、ログ出力が必要な箇所や、ユーザーに具体的なエラーメッセージを表示すべき箇所では、変換する前に必ずログを記録するか、エラーをハンドリングするようにしてください。

この変換を使いこなすことで、複雑なエラーハンドリングから解放され、より宣言的で読みやすいコードを書けるようになります。ぜひ、外部公開用のAPIやコンポーネントの境界線で活用してみてください。

コメント

タイトルとURLをコピーしました