ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

柯里化 (Haskell Brooks Curry)

2021-01-05 10:58:56  阅读:238  来源: 互联网

标签:function 柯里化 return 函数 Brooks Haskell func checkAge Curry


概念:
1、当一个函数有多个参数的时候先传递一部分参数调用它(这部分参数以后永远不变)
2、然后返回一个新的函数接收剩余的参数,返回结果

使用柯里化解决硬编码的问题

function checkAge (age) {
  let min = 18
  return age >= min
}

// 普通纯函数

function checkAge (min, age) {
  return age >= min
}
checkAge(18, 24)
checkAge(18, 20)
checkAge(20, 30)

// 柯里化

function checkAge (min) {
  return function (age) {
    return age >= min
  }
}

// ES6 写法

let checkAge = min => (age => age >= min)
let checkAge18 = checkAge(18)
let checkAge20 = checkAge(20)
checkAge18(24)
checkAge18(20)

lodash 中的柯里化函数
_.curry(func)
功能:创建一个函数,该函数接收一个或多个 func 的参数,如果 func 所需要的参数都被提供则执行 func 并返回执行的结果。否则继续返回该函数并等待接收剩余的参数。
参数:需要柯里化的函数
返回值:柯里化后的函数

const _ = require('lodash')
// 要柯里化的函数
function getSum (a, b, c) {
  return a + b + c
}
// 柯里化后的函数
let curried = _.curry(getSum)
// 测试
curried(1, 2, 3)
curried(1)(2)(3)
curried(1, 2)(3)

案例

const _ = require('lodash')
const match = _.curry(function (reg, str) {
  return str.match(reg)
})
const haveSpace = match(/\s+/g)
const haveNumber = match(/\d+/g)

console.log(haveSpace('hello world'))
console.log(haveNumber('25$'))

const filter = _.curry(function (func, array) {
  return array.filter(func)
})
console.log(filter(haveSpace, ['John Connor', 'John_Donne']))
const findSpace = filter(haveSpace)
console.log(findSpace(['John Connor', 'John_Donne']))

模拟 _.curry() 的实现

function curry (func) {
  return function curriedFn (...args) {
    // 判断实参和形参的个数
    if (args.length < func.length) {
      return function () {
         return curriedFn(...args.concat(Array.from(arguments)))
      } 
    }
    // 实参和形参个数相同,调用 func,返回结果
    return func(...args) }
}

总结
1、柯里化可以让我们给一个函数传递较少的参数得到一个已经记住了某些固定参数的新函数 这是一种对函数参数的’缓存’
2、让函数变的更灵活,让函数的粒度更小 可以把多元函数转换成一元函数,可以组合使用函数产生强大的功能

标签:function,柯里化,return,函数,Brooks,Haskell,func,checkAge,Curry
来源: https://blog.csdn.net/weixin_38550182/article/details/112218165

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有