摘要:而純函數(shù),主要強(qiáng)調(diào)相同的輸入,多次調(diào)用,輸出也相同且無(wú)副作用。對(duì)于組合可能不返回值的函數(shù)很有用在其它的一些地方,也稱為,也稱為,也稱為
參考文檔1
參考文檔2
// 設(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á)式按需求值。
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));
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
const add = (x, y) => x + y
const curriedAdd = _.curry(add)
curriedAdd(1, 2) // 3
curriedAdd(1) // (y) => 1 + y
curriedAdd(1)(2) // 3
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
//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ù)學(xué)中的冪等性
接口的冪等性
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è)面向?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不存在
const morethenTwo = (a) => a > 2;
;[1, 2, 3, 4].filter(morethenTwo);
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
【不好理解】
【一個(gè)范疇遵從三個(gè)原則】
//一致性
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);
Array.of(1) // [1]
//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" ]
// uppercase :: String -> String
const uppercase = (str) => str.toUpperCase()
// decrement :: Number -> Number
const decrement = (x) => x - 1
// 提供函數(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 ]
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
var sum = [1,2,3,4].reduce(function(total,val){
return total += val;
})
console.log(sum);
//通常 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)
// 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"
// point :: (Number, Number) -> {x: Number, y: Number}
const point = (x, y) => ({x: x, y: y})
// 想象一下,在這里我們不能設(shè)置只能具有這些值的類型
const bools = new Set([true, false])
const halfTrue = new Set([half-true])
// 弱邏輯類型包含 bools 和 halfTrue 值的總和
const weakLogicValues = new Set([...bools, ...halfTrue])
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/1214.html
摘要:函數(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ù)式編程也不例外。...
摘要:函數(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ù)式編程也不例外。...
摘要:所以我覺得函數(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è)流淌著滬江血液...
摘要:返回一個(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ù)做...
摘要:在函數(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...
閱讀 730·2023-04-25 19:43
閱讀 3974·2021-11-30 14:52
閱讀 3801·2021-11-30 14:52
閱讀 3865·2021-11-29 11:00
閱讀 3796·2021-11-29 11:00
閱讀 3894·2021-11-29 11:00
閱讀 3571·2021-11-29 11:00
閱讀 6154·2021-11-29 11:00