このブログは、旧・はてなダイアリー「檜山正幸のキマイラ飼育記 メモ編」(http://d.hatena.ne.jp/m-hiyama-memo/)のデータを移行・保存したものであり、今後(2019年1月以降)更新の予定はありません。

今後の更新は、新しいブログ http://m-hiyama-memo.hatenablog.com/ で行います。

述語、ガード、レトラクトの相互変換

「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;
}