0
db.findUser(id).then(R.pipe(
    R.ifElse(firstTestHere, Either.Right,() => Either.Left(err)), 
    R.map(R.ifElse(secondTestHere, obj => obj,() => Either.Left(err))), 
    console.log 
)) 

最初のテストに合格しないと、Either.Leftが返され、2番目のテストは呼び出されません。それは出します:最初の1が過ぎたが二番目のは、それはなるだろうしていない場合 いずれかを転送する方法。どちらかを右にします。左か?

_Right {value: user}

しかし

は:

_Right {value: _Left {value: err}}

を私は出力_Left {値にそれをしたいです:エラーを訂正する方法、または右に左に転送する方法はありますか?

+0

? –

+0

それはちょうど私が他のどこかのように宣言しています:()=>新しいエラー( 'いくつかのエラーメッセージ') – qwang

答えて

2

mapは、2つのEitherインスタンスをまとめて「平坦化」することができません。これを行うには、代わりにchainを使用します。

db.findUser(id).then(R.pipe(
    R.ifElse(firstTestHere, Either.Right,() => Either.Left(err)), 
    R.chain(R.ifElse(secondTestHere, Either.Right,() => Either.Left(err))), 
    console.log 
)) 

一部モナドを生成する機能、すなわち、また、構成する各機能は、フォームMonad m => a -> m bを取る必要がありcomposeK/pipeK、で達成することができると共にチェーンの呼び出しの一連の構成のこのパターン(例えばEither)を所定の値から除外する。 R.pipeKを使用して

、あなたの例は次のように変更することができます。

あなた `err`パラメータがから来ている
// helper function to wrap up the `ifElse` logic 
const assertThat = (predicate, error) => 
    R.ifElse(predicate, Either.Right, _ => Either.Left(error)) 

const result = db.findUser(id).then(R.pipeK(
    assertThat(firstTestHere, err), 
    assertThat(secondTestHere, err) 
)); 
関連する問題