函数式编程

91 阅读1分钟

1.λ演算(lambda calculus)

lambda演算强调的是变换规则的运用

2.柯里化:

代码

function curry(fn, args) {
    var length = fn.length
    var args = args || []
    return function() {
        newArgs = args.concat(Array.prototype.slice.call(arguments))
        if (newArgs.length < length) {
            return curry.call(this,fn,newArgs)
        } else { 
            return fn.apply(this,newArgs)
        }
    }
}
function multiFn(a, b, c) {
    return a * b * c
}
var multi = curry(multiFn)
multi(2)(3)(4)
multi(2,3,4)
multi(2)(3,4)
multi(2,3)(4)

意义

在于把多个参数的函数等价转化成多个单参数函数的级联,这样所有的函数就都统一了,方便做lambda演算。

const judgeFormat = boolean => item => !/^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/.test(item) ^ boolean
const judgeRepeat = boolean => (item, _, array) => array.indexOf(item) == array.lastIndexOf(item) ^ boolean
this.count.correct = phoneList.filter(judgeRepeat(false)).filter(judgeFormat(true)).length