函數式編程

函數式編程

特點

Pure & Impure

//Pure functions
function square(x) {
    return x * x;
}
function squareAll(items) {
    return items.map(square);
}

//Impure functions
function square(x) {
    return x * x;
}
function squareAll(items) {
    for (let i = 0; i < items.length; i++) {
        item[i] = square(items[i]);//It modified the incoming data;
    }
}

slice & splice

mostly-adequate-guide
In functional programming, we dislike unwieldy functions like splice that mutate data.

let xs = [1, 2, 3, 4, 5];
// Impure
xs.splice(0, 3);
//=> [1,2,3]

xs.splice(0, 3);
//=> [4,5]

xs.splice(0, 3);
//=> []

// Pure
xs.slice(0, 3);
//=> [1,2,3]

xs.slice(0, 3);
//=> [1,2,3]

xs.slice(0, 3);
//=> [1,2,3]
// Impure
let minimum = 21;
let checkAge = function(age) {
  return age >= minimum;
};
// Pure
let checkAge = function(age) {
  let minimum = 21;
  return age >= minimum;
};

Immutable & Mutable

//Mutable
function addOne(numArray: any[]): any[] {
    for (let x in numArray) {
        numArray[x] = numArray[x] + 1;
    }
    return numArray;
}

function addOne(numArray: any[]): any[] {
    let addedArray: any[];
    for (let x in numArray) {
        addedArray[x] = numArray[x] + 1;
    }
    return addedArray;
}

function addOne(numArray: any[]): any[] {
    let addedArray: any[] = new Array();
    for (let x of numArray) {
        addedArray.push(x + 1);
    }
    return addedArray;
}

function addOne(numArray: any[]): any[] {
    let addedArray: any[];
    numArray.forEach((element, index) => {
        addedArray[index] = element + 1;
    });
    return addedArray;
}
//Immutable
function addOne(numArray: any[]): any[] {
    return numArray.map((item) => {
        return item + 1;
    })
}
let a = [1, 2, 3, 4, 5];
Object.freeze(a);
console.log(addOne(a));

what’s the difference between foreach & map?

for…in
for…of
foreach
map

foreach

其他示例

函數式編程中的循環

//for loop
function accumulate(n) {
    let result = 0;
    for (n; n > 0; n--) {
        result = n + result;
    }
    return result;
}
//Recursive loop
function accumulate(n) {
    if (n === 0) {
        return 0;
    } else {
        return n + accumulate(n - 1);
    }
}

尾調用優化

http://www.ruanyifeng.com/blog/2015/04/tail-call.html

//Recursive loop
function accumulate(n) {
    if (n === 0) {
        return 0;
    } else {
        return n + accumulate(n - 1);
    }
}
//Tail Call Optimization
"use strict";
function accumulate(n, result) {
    if (n === 0) {
        return result;
    } else {
        return accumulate(n - 1, n + result);
    }
}

爲什麼尾調用優化失敗?

http://web.jobbole.com/86086/

一等公民 —– 函數

函數與數學

Redux示例

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章