2

私はたくさんの関数がJustまたはNothingの値を返していますが、このように一緒にチェーンしたいとします。チェーンコールによるRamda Pass "Maybe"エラーメッセージ

var a = M.Just("5").map(function(data){ 
    return 1; 
}).chain(function(data){ 
/*Make some operation return Just or Nothing */ 
    console.log(data); 
    return M.Just(2); 
}).chain(function(data){ 
/*Make some operation return Just or Nothing */ 
    console.log(data); 
    return M.Nothing("Reason 1"); 
}).chain(function(data){ 
/*Make some operation return Just or Nothing */ 
    console.log(data); 
    return M.Nothing("Reason 2"); 
}).getOrElse(function(data){ 
    console.log(data); 
    return "Message"; 
}); 

console.log(a()); 

出力:関数はM.Nothing(「原因1」)を戻り、このステップにおいて失敗しているので、この上記のコードで

>  1 
>  2 
>  undefined 
>  Message 

それは何である他の機能上を通過しません期待される。私は、パラメータを取るNothingのための有効なコンストラクタがないと信じています。実行の最後にこの失敗メッセージを受け取る方法はありますか?私はこのようにフォークにこれを試しましたが、これはファンタジーランド仕様に関連していますか?

ありがとうございました

+1

「Maybe」と「Either」の両方が短絡を表しています。しかし、後者はエラーメッセージを出すことができますが、前者はエラーメッセージを出力できません。 – ftor

+1

複数のエラーを収集する場合は、「検証」タイプのように見てください。 –

答えて

4

この目的のためには、いずれかのモナドをドキュメントに記載されているとおりに使用できます。

どちらのタイプも、何らかの形で失敗の概念を表すためによく使用されるという点で、Maybeタイプと非常に似ています。

以下のいずれかのモナドで変更した例を変更しました。

var R = require('ramda'); 
var M = require('ramda-fantasy').Either; 

var a = M.Right("5").map(function(data){ 
return 1; 
}).chain(function(data){ 
/*Make some operation return Just or Nothing */ 
console.log(data); 
return M.Right(2); 
}).chain(function(data){ 
/*Make some operation return Just or Nothing */ 
console.log(data); 
return M.Left("Reason 1"); 
}).chain(function(data){ 
/*Make some operation return Just or Nothing */ 
console.log(data); 
return M.Left("Reason 2"); 
}); 
console.log(a); 
console.log(a.isLeft);