スタートページJavascript関数への引数渡し

引数タイプのpolymorphism


polymorphism

例えば、sqrt(x) という関数を作成するとき、x がスカラならば sqrtS(4)、ベクトルならば sqrtV([4, 9]) のように、個別の関数を作るのではなく、sqrt(x) としてまとめられれば便利です。
   s = sqrt(4)     → s = 2
   v = sqrt([4, 9]); → v = [2, 3]
それをここでは、「引数タイプのpolymorphism」といいます。
(s = sqrtV([4]) とする規則にすれば一つの配列型関数で済むでしょうが、不注意のエラーが頻出するでしょう。)

これを実現するには、関数側で引数のタイプを判別する必要があります。
スカラとベクトルの判別
   if (typeof x == "number") {スカラ}; else {ベクトル};
ベクトルとマトリックスの判別
   if (x[1].length > 0) {マトリックス}; else {ベクトル};


例示

// スカラーとベクトルの処理を別途に記述できるとき
function fun1(x) {
    if (typeof x == "number") {  // スカラーのときの処理
        var rtns = x + 10;
        return rtns;
    }
    else {                       // スカラーのときの処理
        var rtnv = [];
        for (var i=0; i<x.length; i++) {
            rtnv[i] = x[i] + 10;
        }
        return rtnv;
    }
}
var x = fun1(3);      // 13
var v = fun1([1,2]);  // [11, 12]

=================================================================================
// スカラをサイズ1のベクトルとしてベクトル処理だけを記述するとき
//   関数内では新ベクトルでの処理を記述する必要がある
function fun2(x) {
    var xx = [];                             // 新ベクトルにする
    if (typeof x == "number") xx[0] = x; else xx = x;
    var rtn = [];
    for (var i=0; i<xx.length; i++) {        // ベクトルとして処理
        rtn[i] = xx[i] + 10;                 // 新ベクトル名での処理
    }
    if (typeof x == "number") return rtn[0]; // スカラーとして戻す
    else return rtn;                         // ベクトルとして戻す
}

=================================================================================

// ベクトルとマトリックス(各行の最大値を求める)
function fun3(x) {
    if (x[1].length > 0) var type="m"; else type = "v"; // ベクトルなら存在しないので fause になる

    if (type == "v") {
        var xmax1 = x[0];
        for (var j=1; j<x.length; j++) {
            xmax1 = Math.max(xmax1, x[j]);
        }
        return xmax1;
    }
    else {
        var xmax = [];
        var imax = x.length;
        for (var i=0; i<imax; i++) {
            xmax[i] = x[i][0];
            var jmax = x[i].length;
            for (var j=1; j<jmax; j++) {
                xmax[i] = Math.max(xmax[i], x[i][j]);
            }
        }
        return xmax;
    }
}
var v = [1, 5, 3];
fun3(v);                // 5
var m = [ [1, 5, 3], [4, 6] ];
fun3(m);                // [5, 6]

=================================================================================

// マトリックスをベクトルに変換する
function fun4(x) {
    x = x.flat();       // マトリックスをベクトルに変換
    var xmax = x[0];
    for (var i=1; i<x.length; i++) {
        xmax = Math.max(xmax, x[i]);
    }
    return xmax;
}
var v = [1, 5, 3];
fun4(v);         // 5
var m = [ [1, 5, 3], [4, 6] ];
fun4(m);         // 6

=================================================================================