// 设置一个随机数,需要时,才会计算,每次计算都是一个不同的值 const rand = function*() { while (1 < 2) { yield math.random() } } const randiter = rand() randiter.next() // 每个执行都给出一个随机值,表达式按需求值。
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; } // 无限组合,才是compose的威力所在 var uppercasethenadd = compose(add,uppercase); var doublethenadd = compose(double,add); var addthenadd = compose(add,add); var addthenaddthenuppercase = compose(uppercase,addthenadd);//注意这个函数,以组合函数addthenadd作为其参数,很强大,有没有! console.log(uppercasethenadd("china"));//china111 console.log(doublethenadd("china"));//china111china111 console.log(addthenadd("china"));//china111111 console.log(addthenaddthenuppercase("china"));//china111111 //改进compose,支持2个以上参数 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函数就称为一个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
数学中的幂等性
接口的幂等性
get /pagex http/1.1是幂等的。连续调用多次,客户端接收到的结果都是一样的: 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不是幂等的。如果调用多次,就会增加多行记录: 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是幂等的,即便是不同请求之间接收到的状态码不一样: 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
程序的幂等性
//虽然是一个面向对象的例子,但是可以说明问题 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; } //对内部的影响是一样的,但是返回值可以不同 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
【不好理解】
【一个范畴遵从三个原则】
//一致性 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方法的实现 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
// 提供函数在两种类型间互相转换 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 会在注释中指出参数与返回值的类型 // functionname :: firstargtype -> secondargtype -> returntype // add :: number -> number -> number const add = (x) => (y) => x + y // increment :: number -> number const increment = (x) => x + 1 //如果函数的参数也是函数,那么这个函数需要用括号括起来。 // call :: (a -> b) -> a -> b const call = (f) => (x) => f(x) //字符 a, b, c, d 表明参数可以是任意类型。以下版本的 map 的参数 f,把一种类型 a 的数组转化为另一种类型 b 的数组。 // 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})
// 想象一下,在这里我们不能设置只能具有这些值的类型 const bools = new set([true, false]) const halftrue = new set(['half-true']) // 弱逻辑类型包含 bools 和 halftrue 值的总和 const weaklogicvalues = new set([...bools, ...halftrue])
如对本文有疑问, 点击进行留言回复!!
网友评论