述語、ガード、レトラクトの相互変換
「Erlangのコーディングから、述語、ガード、レトラクト、そしてモナド」で書いた、引数チェックの3つの方式、述語、ガード、レトラクト(フィルター)ですが、当然に相互変換できます。すべての相互変換を書き下してみます(構文はJavaScript)
述語 → ガード
function guard(arg) {
if (pred(arg)) {
return true;
} else {
throw "error";
}
}
ガード → 述語
function pred(arg) {
try {
guard(arg);
return true;
} catch (e) {
return false;
}
}
述語 → レトラクト
function retr(arg) {
if (pred(arg)) {
return arg;
} else {
throw "error";
}
}
レトラクト → 述語
function pred(arg) {
try {
var x = retr(arg);
return true;
} catch (e) {
return false;
}
}
ガード → レトラクト
function retr(arg) {
guard(arg);
return arg;
}
レトラクト → ガード
function guard(arg) {
var x = retr(arg);
return true;
}