文章出處

0.前言

函數式編程擁有更好的,組合性,靈活性,容錯性,相比面向對象編程。
函數式編程入門,需理解“純函數”,“柯里化”,“函數組合”這三個概念。
PS:本篇文章的案例使用ramdajs工具庫。

1.純函數

什么是純函數?
相同輸入,相同輸出,無副作用。
什么是副作用?請看例子。
demo 1-0:

var array1 = [1,2,3,4,5];
var array2 = [1,2,3,5,5];

// 純函數,它沒有改變array1數組
array1.slice(0,3);
//=> [1,2,3]
array1
//=> [1,2,3,5,5]

// 非純函數,副作用是改變了array2數組
array2.splice(0,3);
//=> [1,2,3]
array2
//=> [4,5]

demo 1-1:

// 純函數
var checkAge = function(number) {
  var innerVariable = 12;
  return number >= innerVariable;
};

// 非純函數,依賴外部變量。因為外部變量不可控,所以副作用是函數返回的值不可控。
var externalVariable = 12;
var checkNumber = function(number) {
  return number >= externalVariable;
};
checkNumber(18);
//=> true
externalVariable = 20;
checkNumber(18);
//=> false

2.柯里化

沒有你之前,無可厚非;有了你之后,不可或缺。
你就是柯里化。
那么什么是柯里化?
傳給一個函數部分參數,返回一個函數去處理剩余參數。
當然,被柯里化的函數,都是純函數。
具體理解,請看例子。
demo 2-0

var R = require('ramda');
var minus = function(a, b){ return a- b };
var curryMinus = R.curry( minus );
// R.__是參數占位符
var minus5 = curryMinus( R.__, 5 );
minus5(33);
//=> 28
var minus5Second =curryMinus(5, R.__);
minus5Second(33);
//=> -28

柯里化是函數組合的基礎。因為它能保留任何參數的位置。

3.函數組合

相比面向對象的復用,需涉及到類繼承的重構,虛方法,重寫方法,甚至是抽象類,接口實現等概念,
函數式編程的函數組合概念,則更加自然易懂。
請看例子。
demo 3-0

var R = require('ramda');
var add = R.curry(function (a, b) {
  return a + b;
});
var subtract = R.curry(function(a, b){
  return a - b;
});

// 如果你沒有傳入參數占位符,缺省選中第一個參數
var add9 = add(9);
var subtract1 = subtract(1, R.__);

// 33這個值先經過subtract1運算,再經過add9運算,從右往左。
var result = R.compose(add9, subtract1);
result(33);
//=> 41

告一段落

在這里,我們已經知道函數式語言的三個基本概念純函數,柯里化,函數組合。
并且可以運用函數組合,建一個純函數組成的河流,讓數據流動。
但編程里面還有控制流(control flow)、異常處理(error handling)這些概念,
以后有空寫續集。
我認為,函數式語言的美妙之處是可以更加清晰地描述事物,相比自然語言。


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()