質問でも何でもないんだけどES6の分割代入ってのを勉強不足で知らなくて面白そうだったので遊んでみた

const sum = ([x,...xs]) => !x ? 0 : x + sum(xs);
const a = [1,2,3,4,5,6,7,8,9,10];
console.log(sum(a)); // 55

const maximum = ([x,y,...ys]) => !y ? x : x<y ? maximum([y].concat(ys)) : maximum([x].concat(ys)) ;
const b = [22,56,13,53,89,72,64];
console.log(maximum(b)); // 89

const zipWith = (f,[x,...xs],[y,...ys]) => !x||!y ? [] : [f(x,y)].concat(zipWith(f,xs,ys));
const c = [3,5,8,100];
console.log(zipWith((m,n)=>m*n, a, c)); // [3,10,24,400]

const takeWhile = (f,[x,...xs]) => !x||!f(x) ? [] : [x].concat(takeWhile(f,xs));
const langs = ['C','Java','Python','JavaScript','Perl','C++'];
console.log(takeWhile(x=>x!=='JavaScript', langs)); // ['C','Java','Python']

うーん、先頭に追加したいだけなのにconcat使ってるあたりがダサいな・・・効率悪そう
でもパターンマッチの幅がぐっと広がるし再帰はともかく日常的に重宝しそうだ