2014-06-19

関数型言語

ランダム整数ランダムな個数引数に渡されて、それらを添字順にひとつずつ足して行き、50を超えたらそれまでの配列の中身を返す」みたいなのってどうやって書くんだろう。

手続き的に書くなら

var randoms = [10, 20, 1, 6, 8, 0, 0, 0, 20, 10];

var total = 0;

for (var i = 0, len = randoms.length; i < len; i++) {

if (total > 50) break;

total += randoms[i];

}

return randoms.slice(0, i);

みたいな感じですぐ思いつくんだけど、純粋関数型って変数も許してないしこういうやつは reduce するんでしょ。

まったくわからない。できないんだとしたら何が優れてるんだ。

もちろん、関数型的に each とか map とかすると見やすくなるケースが多いのはわかってるけど。

できること、できないこと、そういうのがあるから結局マルチパラダイム言語でいい感じに取捨選択してねーってことなのかなあ。

  • 純粋関数型のrandom関数は、入れたseedに対して必ず同じ数を返すので、一つ前の乱数を再びseedにするなら、純粋に書けるよ。 もちろん初期値がずっと一緒なら、起動するたびに同じ答え...

  • forループは全部再帰に直せるので再帰を使う。 f(a, b, total)みたいな関数を考える。 aはまだ読んでない値のリスト、bは既に読んだ値のリスト、totalは読んだ値の総和を意味している。 つ...

記事への反応(ブックマークコメント)

ログイン ユーザー登録
ようこそ ゲスト さん