js-读书笔记-函数式编程-递归-checker-andify&orify

import _ from 'underScore'
import Utils from '../lib/utils.js'
// 递归和组合函数
// conjoin Disjoin 的实现

// checker的递归实现:andify
// 英文中ify是使...化。这里的意思是使函数and化
function andify(...preds) {
  return function (...args) {
    const everything = function(ps, truth) {
      if(_.isEmpty(ps)) {
        return truth
      } else {
        const [head, ...tail] = ps
        return args.every(head) && everything(tail, truth)
      }
    }
    return everything(preds, true)
  }
}
function isEven(v) {
  return v % 2 === 0
}
let evenNums = andify(_.isNumber, isEven) // 传入谓词函数
console.log(evenNums(1,2)) // false
console.log(evenNums(2,4,6,8)) // true
console.log(evenNums(2,4,6,8,9)) // false

function orify(...preds) {
  return function(...args) {
    const something = function(ps, truth) {
      if(_.isEmpty(ps)) {
        return truth
      } else {
        const [head, ...tail] = ps
        return args.some(head) || something(tail, truth)
      }
    }
    return something(preds, false)
  }
}
const zero = x => x === 0
const isOdd = Utils.complement(isEven)
let zeroOrOdd = orify(isOdd, zero)

console.log(zeroOrOdd()) // false
console.log(zeroOrOdd(0,2,4,6)) // true
console.log(zeroOrOdd(2,4,6)) // false




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值