函数的编程思想

函数式编程思想及其解释器的实现 前言 函数表达式在Excel中有着非常重要的作用,excel的公式就是一种基于函数的表达式,但公式中支持诸如“+”、“-”等运算符。纯函数表达式应该只包含函数和参数。遵循这种思想我们可以将数学上的中缀表达式”(56-9)*3+1/6”使用函数的方式来表示: ADD(MULTIPLY(MINUS(56,9),3),DIVIDE(1,6)) 即每一种运算符都可以抽象为一个函数(比较类似于前缀表达 阅读详情

惰性函数

常用于函数库的编写,单例模式中

// 惰性函数
function addEvent(dom, type, handler) {
	if (dom.addEventListener) {
		console.log('first')
		dom.addEventListener(type, handler, false)
		// 这里结合预编译的过程
		addEvent = function(dom, type, handler) {
			 console.log('last')
			 dom.addEventListener(type, handler, false)
		}
	} else {
		dom.attachEvent('on' + type, handler)
		addEvent = function(dom, type, handler) {
			dom.attachEvent('on' + type, handler)
		} 
	}
}
addEvent(btn, 'click', function() {
	alert('ccx')
})
addEvent(btn, 'click', function() {
	alert('ccx1')
})

数据扁平化

最基本的处理方法,这些方法还没考虑到如果数组中包含着对象应该如何解决

function isArray(obj) {
		return 	Object.prototype.toString.call(obj) === '[object Array]'
	}

	var arr1 = [3,[3,[3]]]
	function flatten(arr) {
		var arr = arr || [],
			resArr = [],
			len = arr.length;
			for(var i = 0; i < len; i ++) {
				if (isArray(arr[i])) {
				    resArr = resArr.concat(flatten(arr[i]))
				} else {
					resArr.push(arr[i])
				}
			}
			return resArr
	}

运用forEach(item, index)进行遍历

Array.prototype.flatten = function() {
		var resArr = []
			this.forEach(function(item) {
				Object.prototype.toString.call(item) == '[object Array]' ? resArr = resArr.concat(item.flatten()) : resArr.push(item)
			})
		return resArr
	}

函数式编程纯函数

纯函数是指不依赖,修改其作用域之外变量的函数,可遇不可求

// 这个函数依赖了外部变量num
var num = 10
function compare(x) {
    return x > num
}

记忆函数

提高效率,减少执行时间

function factorial(n) {
		if(n == 1 || n == 0) {
			return 1
		} else {
			return n * factorial(n - 1)
		}
	}

	function memorize(fn) {
		var cache = {}
		return function() {
			var key = arguments.length + Array.prototype.join.call(arguments)
			console.log(key)
			console.log(Array.prototype.join.call(arguments))
			if(cache[key]) {
				return cache[key]
			} else {
				cache[key] = fn.apply(this, arguments)
				return cache[key]
			}
		}
	}
	
	var newF = memorize(factorial)
	console.time()
	console.log(newF(5))
	console.timeEnd()
	console.time()
	console.log(newF(5))
	console.timeEnd()

函数柯里化

为什么要实现柯里化

前段使用柯里化的用途主要是简化代码结构,提高系统的维护性,一个方法只有一个参数,强制了功能的单一性,很自然做到了功能内聚,降低耦合。
优点就是:降低代码的重复,提高代码的适应性

调用的形式

function add(a, b, c) {}
	var newAdd = Curry(add)
	newAdd(2)(3)(3)

代码的实现

function add(a, b, c, d) {
		return a + b + c + d
	}

	function FixParmasCurry(fn) {
	 	// 这里截取的是fn后面的参数
		var _arg = [].slice.call(arguments, 1)
		console.log(_arg)
		return function() {
			var newArg = _arg.concat([].slice.call(arguments, 0))
			return fn.apply(this, newArg) // this绑定的就是add,也固定了应该传进来的参数
		}
	}

	var newAdd = FixParmasCurry(add, 1, 2)
	newAdd(2, 3)
function add(a, b, c, d) {
		return a + b + c + d
	}

	function FixParmasCurry(fn) {
	 	// 这里截取的是fn
		var _arg = [].slice.call(arguments, 1)
		return function() {
			var newArg = _arg.concat([].slice.call(arguments, 0))
			return fn.apply(this, newArg) // this绑定的就是add
		}
	}
	function Curry(fn, length) {
	  // 应该传的参数个数
		var length = length || fn.length
		return function () {
			if (arguments.length < length) {
				[fn, 3, 3, 3]			 
			    var combined = [fn].concat([].slice.call(arguments, 0))
				return Curry(FixParmasCurry.apply(this, combined), length - arguments.length)
			} else {
				return fn.apply(this, arguments)
			}
		}
	}

	var newAdd = Curry(add)
	var a = newAdd(3,3,3)(3)
javascript 编程思想 尤其适合那些对javascript一知半解的 能让你上个档次 javascript是比面向对象语言还要高级的语言 立即下载

相关推荐

Matlab子图排版终极指南:从tight_subplot到tiledlayout的实战对比

本文深入对比Matlab中两大子图排版工具:社区经典函数tight_subplot与官方现代布局管理器tiledlayout。针对默认subplot产生的子图间距与边缘距离问题,详细解析两者的设计哲学、参数控制与实战应用,帮助用户根据版本与需求选择最佳方案,实现高效、精确且美观的多子图排版。

weixin_29048309的博客 360

函数式编程思想

Java 8的Stream使用的是函数式编程模式,如同它的名字一样,它可以被用来对集合或数组进行链状流式的操作。可以更方便的让我们对集合或数组操作。我们在编写代码的时候出现最多的就是空指针异常。所以在很多情况下我们需要做各种非空的判断。if (author!= null) {尤其是对象中的属性还是一个对象的情况下。这种判断会更多。而过多的判断语句会让我们的代码显得臃肿不堪。所以在JDK8中引入了Optional,养成使用Optional的习惯后你可以写出更优雅的代码来避免空指针异常。

qq_47640605的博客 357

记一次使用STM32F042K6芯片内部HSI48M时钟导致CAN总线报错问题

深入去解决某个问题时,也会加深你对其它部分的了解和思考,比如这里让我又重新了解和CAN的采样点和CAN报错机制。

ApexYuan 860

函数式编程思维

1.纯函数 对于相同的输入,永远会得到相同的输出,而且没有任何可观察的副作用,也不依赖外部环境的状态。 var xs = [1,2,3,4]; //Array.slice是纯函数,因为它没有副作用,对于固定的输入,输出总是固定的 xs.slice(0,2); xs.splice(0,2); //会改变源数据,非纯函数 优缺点: import _ from 'loadsh'; var sin = _.memorize(x => Math.sin(x)); //第一次计算

Two_Too的专栏 1565

锐浪报表 Grid++Report 子报表 Delphi

锐浪报表 Grid++Report 是国内较好的报表控件,本人一直使用它,做出很多特色的报表。可以说你的报表设计出来,它基本上能做出来。 但是它帮助文件上,说的不深,近期因为要做一个有关社工的报表,大表中,嵌套2个子表。可以说,一个表到三个数据集,分别打印。 在认真看了帮助的基础上,网上探索,基本无此类,特别是Delphi的帮助,几乎为零。经二天摸索,做出来了。 一、设计思路 1、大表和二个小表,可以设计为三个表,分别使用三个GridppReport控件,取名...

lyhoo163的专栏 9076

SpyGlass Lint脚本实战:从环境配置到报告生成的完整流程解析

本文详细解析了使用SpyGlass Lint脚本进行数字芯片设计代码质量检查的完整自动化流程。从环境配置、目录结构设计,到核心TCL脚本的编写与模块化配置,再到脚本执行、调试技巧及报告解读,提供了构建健壮、可维护自动化检查框架的实战指南。文章重点阐述了如何通过脚本实现从环境配置到报告生成的一键式操作,并探讨了与企业级CI/CD流程集成的进阶方案。

weixin_29196613的博客 441

函数式编程的核心思想

函数式编程最近几年越炒越热,有函数式编程的语言鄙视没有函数式编程的语言,纯函数式编程的语言鄙视不纯的函数式编程的语言。 那么,到底什么是函数式编程,函数式编程的核心思想又是什么? 函数式编程的第一个特点就是可以把函数作为参数传递给另一个函数,也就是所谓的高阶函数。例如,对数组进行排序,可以传入一个排序函数作为参数: String[] array = { “orange”, “Pear”, “Apple” }; Arrays.sort(array, String::compareToIgnoreCase);

海阔天空 517

YOLOv8改进 | 主干篇 | 利用MobileNetV2替换Backbone(轻量化网络结构)

本文给大家带来的改进机制是,其是专为移动和嵌入式视觉应用设计的轻量化网络结构。这些模型基于简化的架构,并利用深度可分离卷积构建轻量级深度神经网络,其引入了两个简单的全局超参数,用于在延迟和准确性之间进行有效的权衡。实验表明,MobileNets在资源和准确性的权衡方面表现出色,并在多种应用(如对象检测、细粒度分类、面部属性识别和大规模地理定位)中展现了其有效性,这个模型非常适合轻量化的读者来使用。适用检测目标:轻量化网络结构适合轻量化的读者⭐⭐⭐⭐。

Snu77的博客 5686

Python从入门到实践:函数之两种编程思想(面向过程与函数式编程)

“面向过程”的重心就在过程二字,把一个大问题拆分成很多个小问题,然后依次执行每个小问题,这是一种流水线的、从上而下的过程。

weixin_43507744的博客 819

【2026年华为暑期实习(AI)-4月8日-第一题- 选择题】(题目+思路+Java&C++&Python解析+在线测试)

答案与解析 1. 相关系数问题 答案:C. 完全负线性相关 解析:相关系数ρ=-1表示X和Y之间存在完全负线性相关关系,所有数据点都严格落在一条斜率为负的直线上。 2. 矩阵秩问题 答案:B. Σ的对角线上非零奇异值的个数 解析:矩阵A的秩等于其奇异值矩阵Σ中非零奇异值的个数,因为U和V都是正交矩阵,不改变矩阵的秩。 3. 条件概率问题 答案:B. 0.5 解析:根据全概率公式和贝叶斯公式计算,P(B)=0.5×0.4+0.3×0.6=0.38,P(A|B)=(0.5×0.4)/0.38≈0.526,最接近

m0_73659489的博客 287

点云目标检测:open3d多窗口联动可视化

多个模型之间的对比除了指标之外,还需要可以直接直观的对比可视化结果,这次介绍一下如何使用open3d同时打开两个窗口分别加载两个模型的结果进行对比,同时实现两个窗口的联动,也就是当一个窗口拖动或者缩放时另外一个窗口也跟着做同样的变换。

zhaoguanhua的博客 4688

函数式编程思想概论

函数式编程思想概论前言函数λ 演算λ项绑定变量和自由变量约简α 变换β 约简η 变换纯函数、副作用和引用透明性函数式编程与并发编程总结 原文地址 前言 在讨论函数式编程(Functional Programming)的具体内容之前,我们首先看一下函数式编程的含义。在维基百科上,函数式编程的定义如下:“函数式编程是一种编程范式。它把计算当成是数学函数的求值,从而避免改变状态和使用可变数据。它是一种声...

灵动的艺术的博客 5375

手把手教你完成基于matlab的路面裂缝检测系统设计

裂缝是路面病害最早的形态之一,只有在裂缝出现的早期进行维护,才能有效地提高公路的使用寿命。因此,路面裂缝的检测识别系统对于提升公路质量有着重大的意义。首先,对路面裂缝图像进行相应的预处理,目的是减小环境因素的影响,消除无用的噪点。然后提取目标图像特征,判断路面裂缝类型,标记出路面裂缝的位置。最后通过设计的 GUI 界面来集成各个关键步骤,显示所得到的试验结果。仿真结果表明,设计的路面裂缝检测识别系统是高效可行的。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1216

JavaScript函数式编程思想

纯函数是一种函数,其返回值仅由其输入参数决定,不产生任何可观察的副作用,如修改全局对象或外部状态。纯函数具有以下特性: 1. 确定性:相同的输入永远得到相同的输出; 2. 无副作用:函数执行过程中不会改变任何外部状态; 纯函数在函数式编程中非常重要,因为它们提供了可预测性和可测试性。由于纯函数不依赖于且不修改外部环境的状态,它们在并发环境下特别有用,可以减少在多线程环境中由状态改变引起的错误。此外,纯函数的可组合性使得开发者能够构建更加模块化和可重用的代码。

分享前端工程化、AI 应用、Agent 开发与大模型实践! 1105

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

函数式编程思想详解

函数式编程通过强调不可变性、纯函数和声明式风格,提升代码的模块化和可维护性。在Java中合理利用Lambda、Stream和不可变集合,能显著简化复杂数据处理逻辑,增强并发安全性。然而,需结合实际场景权衡,与面向对象互补使用,方能发挥最大效益

weixin_51288065的博客 990

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

基于微软Ling框架下的函数式编程思想

基于微软Ling框架下的函数式编程思想 核心思想:函数作为参数 假设现在有一个问题: 定义一个函数,可以根据所给条件条件返回学生对象: #直观的做法: def get_students01(list_stu): for item in list_stu: if item.age > 25:#变化的条件 yield item 提取变化,进行单独封装: def condition01(item)...

郑思旭的博客 280

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

JavaScript之函数式编程思想--函数记忆

        函数记忆编程是一种编程思想,主要是解决当我们在编程过程中有些部分或者有些功能是重叠的,可以利用记忆函数来把重叠的部分记录下来。        典型的例子就是阶乘和斐波那契数列了。这里我们用数组来示范一下。var content = 0; function jiece(n) content ++; if(n == 0 || n == 1){ return...

c__dreamer的博客 805

JS进阶DAY3编程思想&构造函数&原型

面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候再一个一个的依次调用就可以了举个栗子:蛋炒饭面向过程,就是按照我们分析好了的步骤,按照步骤解决问题。优点:性能比面向对象高,适合跟硬件联系很紧密的东西,例如单片机就采用的面向过程编程。缺点:没有面向对象易维护、易复用、易扩展。

2402_88794887的博客 838

前端函数式编程思想

我与成长,至死方休~ 一、编程思想 函数式编程(Functional Programming, FP),FP 是编程范式之一,我们常听说的编程范式还有面向过程编程、面向对象编程。 面向对象编程:把现实世界中的事物抽象成程序世界中的类和对象,通过封装、继承和多态来演示事物事件的联系(对事物本身进行抽象) 函数式编程:把现实世界的事物和事物之间的联系抽象到程序世界(对运算过程进行抽 象) // 非函数式 let num1 = 2 let num2 = 3 let sum = num1 + nu..

yuan 1744

day11 Lamdba函数式编程思想

Lambda函数式编程思想与面向对象思想的区别 Lambda函数式编程思想 只要能获取到结果,谁去做的,怎么做的都不重要,重视的是结果,不重视过程 在数学中,函数就是有输入量、输出量的一套计算方案,也就是“拿什么东西做什么事情”。相对而言,面向对象过分强调“必须通过对象的形式来做事情”,而函数式思想则尽量忽略面向对象的复杂语法——强调做什么,而不是以什么形式做。 面向对象的编程思想 做一件事情,找...

java_dreamOfLack的博客 207

柯理化函数编程思想

// 柯里化函数编程思想是指利用闭包的保存机制(形成闭包,把一些信息预习存储起来),供其上下文来使用 // 例题 // 写一个函数fn 使得满足下面条件 // let res = fn(1,2,3,4,5)(3) // console.log(res) // => 1+2+3+4+5+3 = 18 function fn(...params){ return function (...args) { // 利用上面保存的parmas的值 args = args.c

Donnien的博客 175

Python 中的函数式编程思想与应用

函数式编程的核心理念是“纯函数”和不可变性。纯函数是指那些没有副作用且每次使用相同输入都会返回相同输出的函数。例如,Python 中的内置函数 `abs()` 是一个典型的纯函数,因为它总是返回一个非负数。不可变性意味着数据一旦创建就不能被修改。在函数式编程中,我们倾向于使用不可变的数据结构来避免复杂的同步问题。Python 提供了一些工具来帮助实现不可变性,比如元组(tuple)和 frozenset。Python 提供了丰富的函数式编程工具,使开发者能够以更简洁、优雅的方式编写代码。

2501_90688963的博客 419

python 函数式编程思想

函数式编程的基础风格特征: 函数是一等公民 1.函数能作为参数传递,或者是作为返回值返回。 2.函数是变量 它在创建函数时绑定一个函数对象例; def fn() : print (“hello wor1d”) f1= fn f1() #等同于调用函数fn() 高阶函数: 1.函数接受一个或多个函数作为参数传入 2.函数返回一个函教 3.函数作为函数的返回值 示例: def print_hello(): print("hello") return print_hello 4.函数作为函数的参

weixin_44122710的博客 303

面向对象编程思想新解 第三章 融合函数式编程思想

本文主要内容如下。

萝卜地里的兔子的博客 254
上一篇: js执行机制
下一篇: path.resolve和_dirname结合使用
ccxCode
博客等级 码龄8年 1粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值