国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

js函數(shù)式編程術(shù)語(yǔ)總結(jié)

番茄西紅柿 / 2209人閱讀

摘要:而純函數(shù),主要強(qiáng)調(diào)相同的輸入,多次調(diào)用,輸出也相同且無(wú)副作用。對(duì)于組合可能不返回值的函數(shù)很有用在其它的一些地方,也稱為,也稱為,也稱為

參考文檔1

參考文檔2

函數(shù)式編程術(shù)語(yǔ)


高階函數(shù) Higher-Order Functions

  • 以函數(shù)為參數(shù)的函數(shù)
  • 返回一個(gè)函數(shù)的函數(shù)

函數(shù)的元 Arity

  • 比如,一個(gè)帶有兩個(gè)參數(shù)的函數(shù)被稱為二元函數(shù)

惰性求值 Lazy evaluation

  • 是一種按需求值機(jī)制,它會(huì)延遲對(duì)表達(dá)式的求值,直到其需要為止
// 設(shè)置一個(gè)隨機(jī)數(shù),需要時(shí),才會(huì)計(jì)算,每次計(jì)算都是一個(gè)不同的值
const rand = function*() {
  while (1 < 2) {
    yield Math.random()
  }
}
const randIter = rand()
randIter.next() // 每個(gè)執(zhí)行都給出一個(gè)隨機(jī)值,表達(dá)式按需求值。

偏函數(shù) Partial Application

  • 即【降元】,將一個(gè) n 元函數(shù)轉(zhuǎn)換成一個(gè) n - x 元函數(shù)
  • 或者這樣理解,通過(guò)對(duì)【復(fù)雜的函數(shù)】填充一部分?jǐn)?shù)據(jù)來(lái)構(gòu)成一個(gè)【簡(jiǎn)單的函數(shù)】
  • 柯里化就是通過(guò)偏應(yīng)用函數(shù)來(lái)實(shí)現(xiàn)
function add(a, b,c) {
    return a + b+c;
}
//也可以
var addOne = add.bind(null, 1,2);
console.log(addOne(2));
//也可以
var addTwo = add.bind(null, 1);
console.log(addTwo(3,4));

柯里化 Currying

  • 將一個(gè)多參數(shù)函數(shù)轉(zhuǎn)換成多個(gè)單參數(shù)函數(shù)
  • 也就是將一個(gè) n 元函數(shù)轉(zhuǎn)換成 n 個(gè)一元函數(shù)
const sum = (a, b) => a + b
const curriedSum = (a) => (b) => a + b
curriedSum(40)(2) // 42.
const add2 = curriedSum(2) // (b) => 2 + b
add2(10) // 12

自動(dòng)柯里化 Auto Currying

  • 將多個(gè)參數(shù)的函數(shù)轉(zhuǎn)換為單參數(shù)的函數(shù)
  • 如果,給定的參數(shù)數(shù)量少于正確的參數(shù),則返回一個(gè)函數(shù),該函數(shù)將獲得其余的參數(shù)
  • 如果,函數(shù)得到正確數(shù)量的參數(shù)時(shí),它就會(huì)被求值
  • 示例,lodash 和 Ramda 都有一個(gè) curry 函數(shù),但 underscore 沒有
const add = (x, y) => x + y
const curriedAdd = _.curry(add)
curriedAdd(1, 2) // 3
curriedAdd(1) // (y) => 1 + y
curriedAdd(1)(2) // 3

compose 組合函數(shù)

  • 概念:它將需要嵌套執(zhí)行的函數(shù)平鋪。嵌套執(zhí)行指的是,一個(gè)函數(shù)的返回值將作為另一個(gè)函數(shù)的參數(shù)
  • 作用:實(shí)現(xiàn)函數(shù)式編程中的 pointfree 風(fēng)格(無(wú)參數(shù)),使我們專注于【轉(zhuǎn)換】而不是【數(shù)據(jù)】
  • 實(shí)現(xiàn):接收多個(gè)函數(shù)作為參數(shù),從右到左,一個(gè)函數(shù)的輸入為另一個(gè)函數(shù)的輸出
  • 意義:編程更精練、算法更清晰、無(wú)參數(shù)干擾
  • 威力:==【任意組合】==
  • 缺點(diǎn):不能直觀的看到參數(shù)
  • 示例
var compose = function(fun1,fun2){
    return function(val){
        return fun1(fun2(val));
    }
}

var add = function(val){
  return val + "111";
}

var upperCase = function(val){
  return val.toUpperCase();
}

var double = function(val){
  return val += val;
}
// 無(wú)限組合,才是compose的威力所在
var upperCaseThenAdd = compose(add,upperCase);
var doubleThenAdd = compose(double,add);
var addThenAdd = compose(add,add);
var addThenAddThenUpperCase = compose(upperCase,addThenAdd);//注意這個(gè)函數(shù),以組合函數(shù)addThenAdd作為其參數(shù),很強(qiáng)大,有沒有!

console.log(upperCaseThenAdd("china"));//CHINA111
console.log(doubleThenAdd("china"));//china111china111
console.log(addThenAdd("china"));//china111111
console.log(addThenAddThenUpperCase("china"));//CHINA111111
//改進(jìn)compose,支持2個(gè)以上參數(shù)
var compose1 = function(){
  var args = arguments;
  return function(initVal){
    var val = initVal;
    for(key in args){
      val = args[key](val);
    }
    return val;
  }
  
}
var doubleThenUpperCaseThenAddThenAdd = compose1(double,upperCase,add,add);
console.log(doubleThenUpperCaseThenAddThenAdd("china"));//CHINACHINA111111

Continuation

  • 概念:在一個(gè)程序執(zhí)行的任意時(shí)刻,尚未執(zhí)行的代碼稱為 Continuation
  • 作用:異步請(qǐng)求回調(diào)、異步監(jiān)聽回調(diào)等
  • 示例
//continueFun函數(shù)就稱為一個(gè)Continuation
var addOneAndContinue = function(val,continueFun){
  var val = val + 1;
  return continueFun(val);
}
var mutiply = function(val){
  return val * 5;
}
console.log(addOneAndContinue(100,mutiply));//505

純函數(shù) Purity

  • 輸出僅由輸入決定,不依賴也不修改外部狀態(tài),即不產(chǎn)生副作用

副作用 Side effects

  • 如果函數(shù)與外部可變狀態(tài)進(jìn)行交互,則它是有副作用的

冪等性 Idempotent

數(shù)學(xué)中的冪等性

  • foo(x) 將產(chǎn)生與 foo(foo(x))、foo(foo(foo(x))) 等相同的輸出
  • [二元運(yùn)算],它需要三個(gè)元素:二元運(yùn)算符以及該運(yùn)算符作用的兩個(gè)變量。如四則運(yùn)算的加、減、乘、除均屬于二元運(yùn)算。乘法下唯一兩個(gè)冪等實(shí)數(shù)為0和1
  • [一元運(yùn)算],例如 ++ ,正+,負(fù)-。比如[高斯符號(hào)],它是一個(gè)數(shù)學(xué)符號(hào),形式為方括號(hào)[x],表示不大于x的最大整數(shù),高斯符號(hào)是冪等的

接口的冪等性

  • 對(duì)接口而言,冪等性實(shí)際上就是接口可重復(fù)調(diào)用,在調(diào)用方多次調(diào)用的情況下,接口最終得到的結(jié)果是一致的。比如,在App中下訂單的時(shí)候,點(diǎn)擊確認(rèn)之后,沒反應(yīng),就又點(diǎn)擊了幾次。在這種情況下,如果無(wú)法保證該接口的冪等性,那么將會(huì)出現(xiàn)重復(fù)下單問(wèn)題
  • [http方法的冪等],指的是同樣的請(qǐng)求被執(zhí)行一次與連續(xù)執(zhí)行多次的效果是一樣的,服務(wù)器的狀態(tài)也是一樣的(注意,只是服務(wù)器狀態(tài),和服務(wù)器返回狀態(tài)無(wú)關(guān))
  • 舉例
GET /pageX HTTP/1.1是冪等的。連續(xù)調(diào)用多次,客戶端接收到的結(jié)果都是一樣的:
GET /pageX HTTP/1.1   
GET /pageX HTTP/1.1   
GET /pageX HTTP/1.1   
GET /pageX HTTP/1.1

POST /add_row HTTP/1.1不是冪等的。如果調(diào)用多次,就會(huì)增加多行記錄:
POST /add_row HTTP/1.1
POST /add_row HTTP/1.1   -> Adds a 2nd row
POST /add_row HTTP/1.1   -> Adds a 3rd row

DELETE /idX/delete HTTP/1.1是冪等的,即便是不同請(qǐng)求之間接收到的狀態(tài)碼不一樣:
DELETE /idX/delete HTTP/1.1   -> Returns 200 if idX exists
DELETE /idX/delete HTTP/1.1   -> Returns 404 as it just got deleted
DELETE /idX/delete HTTP/1.1   -> Returns 404

程序的冪等性

  • 概念:一個(gè)函數(shù)執(zhí)行多次皆返回相同的結(jié)果
  • 作用:一個(gè)函數(shù)被調(diào)用多次時(shí),保證內(nèi)部狀態(tài)的一致性
  • 對(duì)比:和純函數(shù)相比,冪等主要強(qiáng)調(diào)多次調(diào)用,對(duì)內(nèi)部的狀態(tài)的影響是一樣的(但多次調(diào)用返回值可能不同)。而純函數(shù),主要強(qiáng)調(diào)相同的輸入,多次調(diào)用,輸出也相同且無(wú)副作用。==純函數(shù)一定是冪等的==
  • 意義:在任何可能的情況下通過(guò)冪等的操作限制副作用要比不做限制的更新要好得多。確保操作是冪等的,可避免意外的發(fā)生
//雖然是一個(gè)面向?qū)ο蟮睦樱强梢哉f(shuō)明問(wèn)題
var Student = function(name,age){
  this.name = name;
  this.age = age;
};
Student.prototype.delName = function(){
  var response = this.name ? this.name + "已被刪除":"name不存在";
  this.name = null;
  return response;
}
//對(duì)內(nèi)部的影響是一樣的,但是返回值可以不同
var lilei = new Student("lilei",19);
console.log(lilei.delName());//lilei已被刪除
console.log(lilei.delName());//name不存在
console.log(lilei.delName());//name不存在

Point-Free 風(fēng)格

  • 定義函數(shù)時(shí),不顯式地指出函數(shù)所帶參數(shù)。這種風(fēng)格通常需要柯里化或者高階函數(shù)。也叫 Tacit programming

斷言函數(shù) Predicate

  • 根據(jù)輸入返回 true 或 false。通常用在 Array.prototype.filter 的回調(diào)函數(shù)中。
const morethenTwo = (a) => a > 2;
;[1, 2, 3, 4].filter(morethenTwo);

契約 Contracts

  • 契約保證了函數(shù)或者表達(dá)式在運(yùn)行時(shí)的行為。當(dāng)違反契約時(shí),將拋出一個(gè)錯(cuò)誤
  • 比如數(shù)據(jù)類型檢測(cè)
const contract = (input) => {
  if (typeof input === number) return true
  throw new Error(Contract Violated: expected int -> int)
}

const addOne = (num) => contract(num) && num + 1

addOne(2)
addOne(hello) // Error

范疇 Category

【不好理解】

  • 范疇是指,對(duì)象(object)及它們之間的態(tài)射(箭頭,箭頭可以組合)
  • 在程序中,數(shù)據(jù)類型作為對(duì)象,函數(shù)作為態(tài)射

【一個(gè)范疇遵從三個(gè)原則】

  • 必有一個(gè)態(tài)射(函數(shù)),使得 map 一個(gè)對(duì)象是它自身
  • 態(tài)射(函數(shù))必是可組合的
  • 合成滿足結(jié)合律。f ? (g ? h) 與 (f ? g) ? h 是等價(jià)的

態(tài)射 morphism

  • 某一范疇中,對(duì)象之前的變換關(guān)系(一個(gè)變形的函數(shù))

函子 functor(范疇學(xué)的內(nèi)容)

  • 一個(gè)實(shí)現(xiàn) map 函數(shù)的對(duì)象
  • 在 javascript 中一個(gè)常見的函子是 Array,因?yàn)樗袷匾蜃拥膬蓚€(gè)準(zhǔn)則
  • 一致性 Preserves identity,即范疇的第一個(gè)原則
  • 組合性 Composable
  • 示例
//一致性
object.map(x => x) ? object
//組合性
var fun1 = function(x){
  return x+1;
}
var fun2 = function(x){
  return x*x;
}
var res1 = [1,2,3].map(fun1).map(fun2);
var res2 = [1,2,3].map(function(x){
  return fun2(fun1(x));
});
console.log(res1,res2);

Pointed Functor

  • 一個(gè)具有 of 函數(shù)的對(duì)象,它將 任何 多帶帶的值放入其中
  • ES6增加了 Array.of ,使數(shù)組成為一個(gè) Pointed Functor
Array.of(1) // [1]

引用透明性 Referential Transparency

  • 定義:一個(gè)表達(dá)式在程序中可以被它等價(jià)的值替換,而不影響結(jié)果
  • 對(duì)函數(shù)而言:如果函數(shù)的返回值只依賴于其輸入值,這種特性就稱為引用透明性
  • ==純函數(shù)具有引用透明性==
等式推理 Equational Reasoning
  • 指當(dāng)應(yīng)用程序由表達(dá)式組成,并且沒有副作用時(shí),關(guān)于系統(tǒng)的真值可以從各個(gè)部分推導(dǎo)出來(lái)
  • 純函數(shù)式語(yǔ)言的優(yōu)點(diǎn)之一是易于進(jìn)行等式推理,通過(guò)引用透明度實(shí)現(xiàn),并且能夠在所有上下文中用等號(hào)替換equals

不可變性

  • 比如es6中的 const 常量設(shè)計(jì)

匿名函數(shù) Lambda

  • 匿名函數(shù)往往被視作一個(gè)值
  • 匿名函數(shù)通常作為高階函數(shù)的參數(shù)
  • 可以把 Lambda 賦值給一個(gè)變量

Monad 對(duì)象

  • 擁有 of 和 chain 函數(shù)的對(duì)象。chain 很像 map, 除了用來(lái)鋪平嵌套數(shù)據(jù)
  • 示例,以數(shù)組來(lái)實(shí)現(xiàn)
//of
Array.of(1,2,3);//[ 1, 2, 3 ]
//chain方法的實(shí)現(xiàn)
Array.prototype.chain = function (f) {
  return this.reduce((acc, it) => acc.concat(f(it)), [])  
};
Array.of(cat,dog, fish,bird).chain(s => s.split(,));//[ "cat", "dog", "fish", "bird" ]

Comonad 對(duì)象

  • 擁有 extract 與 extend 函數(shù)的對(duì)象

自同態(tài) Endomorphism

  • 輸入輸出是相同類型的函數(shù)
  • 示例:
// uppercase :: String -> String
const uppercase = (str) => str.toUpperCase()
// decrement :: Number -> Number
const decrement = (x) => x - 1

Applicative Functor

  • 一個(gè)擁有 ap 函數(shù)的對(duì)象

同構(gòu) Isomorphism

  • 不用類型對(duì)象的變形,保持結(jié)構(gòu)并且不丟失數(shù)據(jù)
  • 例如,一個(gè)二維坐標(biāo)既可以表示為數(shù)組 [2, 3],也可以表示為對(duì)象 {x: 2, y: 3}
// 提供函數(shù)在兩種類型間互相轉(zhuǎn)換
const pairToCoords = (pair) => ({x: pair[0], y: pair[1]})
const coordsToPair = (coords) => [coords.x, coords.y]

console.log(pairToCoords([1, 2]));//{ "x": 1, "y": 2 }
console.log(coordsToPair({x: 1, y: 2}));//[ 1, 2 ]

Setoid 對(duì)象

  • 定義:擁有 equals 函數(shù)的對(duì)象。equals 可以用來(lái)和其它對(duì)象比較。
Array.prototype.equals = function (arr) {
  const len = this.length
  if (len !== arr.length) {
    return false
  }
  for (let i = 0; i < len; i++) {
    if (this[i] !== arr[i]) {
      return false
    }
  }
  return true
}

;[1, 2].equals([1, 2])   // true
;[1, 2].equals([3, 4])   // false

半群 Semigroup

  • 定義:一個(gè)擁有 concat 函數(shù)的對(duì)象。concat 可以連接相同類型的兩個(gè)對(duì)象
  • 示例:比如 Array具有concat方法

Foldable 對(duì)象

  • 定義:一個(gè)擁有 reduce 函數(shù)的對(duì)象,reduce 可以把一種類型的對(duì)象轉(zhuǎn)化為另一種類型
  • 示例:將一個(gè)list轉(zhuǎn)為number
var sum = [1,2,3,4].reduce(function(total,val){
  return total += val;
})
console.log(sum);

類型簽名 Type Signatures

  • 一種注釋方式
//通常 js 會(huì)在注釋中指出參數(shù)與返回值的類型
// functionName :: firstArgType -> secondArgType -> returnType
// add :: Number -> Number -> Number
const add = (x) => (y) => x + y
// increment :: Number -> Number
const increment = (x) => x + 1

//如果函數(shù)的參數(shù)也是函數(shù),那么這個(gè)函數(shù)需要用括號(hào)括起來(lái)。
// call :: (a -> b) -> a -> b
const call = (f) => (x) => f(x)

//字符 a, b, c, d 表明參數(shù)可以是任意類型。以下版本的 map 的參數(shù) f,把一種類型 a 的數(shù)組轉(zhuǎn)化為另一種類型 b 的數(shù)組。
// map :: (a -> b) -> [a] -> [b]
const map = (f) => (list) => list.map(f)

代數(shù)數(shù)據(jù)類型 Algebraic data type

  • 由其他類型組合在一起的復(fù)合類型。兩種常見的代數(shù)類型是 sum 和 product

聯(lián)合類型(對(duì)象) Union Type

  • 定義:連接不同的數(shù)據(jù)類型
  • 示例:add就是一個(gè)聯(lián)合類型對(duì)象,因?yàn)閖s天然支持number和sting求和時(shí),進(jìn)行自動(dòng)數(shù)據(jù)類型轉(zhuǎn)換
// add :: (NumOrString, NumOrString) -> NumOrString
const add = (a, b) => a + b
add(1, 2) // Returns number 3
add(Foo, 2) // Returns string "Foo2"
add(Foo, Bar) // Returns string "FooBar"

Product type

  • 定義:用一種你可能更熟悉的方式把數(shù)據(jù)類型聯(lián)合起來(lái)
// point :: (Number, Number) -> {x: Number, y: Number}
const point = (x, y) => ({x: x, y: y})

Sum 類型(有時(shí)稱為聯(lián)合類型 )

  • 是將兩種類型的組合合并成另一種類型
  • 之所以被稱為 sum ,是因?yàn)榻Y(jié)果類型中可能的值的數(shù)量是輸入類型的總和
  • JavaScript 沒有這樣的類型,但是我們可以使用 Set 來(lái)假裝
// 想象一下,在這里我們不能設(shè)置只能具有這些值的類型
const bools = new Set([true, false])
const halfTrue = new Set([half-true])
// 弱邏輯類型包含 bools 和 halfTrue 值的總和
const weakLogicValues = new Set([...bools, ...halfTrue])

Option | maybe

  • Option 是一種sum type ,它有兩種情況,Some 或者 None。
  • Option 對(duì)于組合可能不返回值的函數(shù)很有用
  • 在其它的一些地方,Option 也稱為 Maybe,Some 也稱為 Just,None 也稱為 Nothing

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/1214.html

相關(guān)文章

  • 前端開發(fā)周報(bào):JavaScript編程術(shù)語(yǔ)和web圖片優(yōu)化

    摘要:函數(shù)式編程術(shù)語(yǔ)大全函數(shù)式編程有許多優(yōu)點(diǎn),它也越來(lái)越流行了。然而,每個(gè)編程范式都有自己獨(dú)特的術(shù)語(yǔ),函數(shù)式編程也不例外。作用域有兩種類似全局作用域和局部作用域。目前最重要的應(yīng)用場(chǎng)景之一,就是在的握手階段,客戶端服務(wù)端利用算法交換對(duì)稱密鑰。 1、JavaScript 函數(shù)式編程術(shù)語(yǔ)大全 函數(shù)式編程(FP)有許多優(yōu)點(diǎn),它也越來(lái)越流行了。然而,每個(gè)編程范式都有自己獨(dú)特的術(shù)語(yǔ),函數(shù)式編程也不例外。...

    kbyyd24 評(píng)論0 收藏0
  • 前端開發(fā)周報(bào):JavaScript編程術(shù)語(yǔ)和web圖片優(yōu)化

    摘要:函數(shù)式編程術(shù)語(yǔ)大全函數(shù)式編程有許多優(yōu)點(diǎn),它也越來(lái)越流行了。然而,每個(gè)編程范式都有自己獨(dú)特的術(shù)語(yǔ),函數(shù)式編程也不例外。作用域有兩種類似全局作用域和局部作用域。目前最重要的應(yīng)用場(chǎng)景之一,就是在的握手階段,客戶端服務(wù)端利用算法交換對(duì)稱密鑰。 1、JavaScript 函數(shù)式編程術(shù)語(yǔ)大全 函數(shù)式編程(FP)有許多優(yōu)點(diǎn),它也越來(lái)越流行了。然而,每個(gè)編程范式都有自己獨(dú)特的術(shù)語(yǔ),函數(shù)式編程也不例外。...

    kelvinlee 評(píng)論0 收藏0
  • 翻譯連載 |《你不知道的JS》姊妹篇 |《JavaScript 輕量級(jí)函數(shù)編程》- 第 1 章:

    摘要:所以我覺得函數(shù)式編程領(lǐng)域更像學(xué)者的領(lǐng)域。函數(shù)式編程的原則是完善的,經(jīng)過(guò)了深入的研究和審查,并且可以被驗(yàn)證。函數(shù)式編程是編寫可讀代碼的最有效工具之一可能還有其他。我知道很多函數(shù)式編程編程者會(huì)認(rèn)為形式主義本身有助于學(xué)習(xí)。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson - 《You-Dont-Know-JS》作者 關(guān)于譯者:這是一個(gè)流淌著滬江血液...

    omgdog 評(píng)論0 收藏0
  • JS函數(shù)編程讀書筆記 - 2

    摘要:返回一個(gè)函數(shù)作為結(jié)果。利用函數(shù)將值的集合合并成一個(gè)值,該函數(shù)接受一個(gè)累積和本次處理的值。集合中心編程函數(shù)式編程對(duì)于需要操作集合中元素的任務(wù)非常有用。 本文章記錄本人在學(xué)習(xí) 函數(shù)式 中理解到的一些東西,加深記憶和并且整理記錄下來(lái),方便之后的復(fù)習(xí)。 函數(shù)是一等公民 一等這個(gè)術(shù)語(yǔ)通常用來(lái)描述值。當(dāng)函數(shù)被看作一等公民時(shí),那它就可以去任何值可以去的地方,很少有限制。比如那數(shù)值和函數(shù)做...

    mykurisu 評(píng)論0 收藏0
  • 函數(shù)編程術(shù)語(yǔ)解析

    摘要:在函數(shù)式編程語(yǔ)言中,這一特性可用于構(gòu)造無(wú)限列表。學(xué)習(xí)網(wǎng)址,是一個(gè)擁有和函數(shù)的數(shù)據(jù)類型,類似于,但它會(huì)輸出非嵌套形式的結(jié)果在其他函數(shù)式編程語(yǔ)言中,也被稱為,也被稱為和。 原文連接 [TOC] Arity 指函數(shù)的參數(shù)數(shù)量,由 -ary 和 -ity 這兩個(gè)英文后綴拼接而成: const sum = (a, b) => a + b; const Arity = sum.length; co...

    Tangpj 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<