函数式

月影MM对面向对象,原型,函数式的理解

徘徊边缘 提交于 2021-01-04 10:42:49
“面向对象”其实好比是人类成年期学习和整理知识的方法 ——把知识分门别类 比如猫、老虎,都属于猫科动物 class 猫 extends 猫科动物 class 老虎 extends 猫科动物 描述的就是这种认知世界的方式 而“原型”是另一种认知世界的方式,是人类与生俱来的,幼年时期的学习方式 小孩子问父母,老虎是什么 父母可能会回答小孩,老虎很像体型较大的猫 或者说,小孩的意识里“猫”和“老虎”相似 用原型体系来表示,就是 猫.prototype = 一只老虎 或者 老虎.prototype = 一只猫 对于小孩来说,从猫认识老虎,再把它们不一样的部分特别说明 这就是原型体系 所以原型体系就是没有分类的、人类原始认知世界的方式 函数式:functional是什么体系,那个其实是数学体系 functional描述世界的方式和数学家描述世界的方式一致 所以functional的抽象基于数学抽象,它在数学公式、算法的描述上占优势,class的抽象基于类别类系的抽象,prototye的抽象基于形似性的抽象。 来源: oschina 链接: https://my.oschina.net/u/4731/blog/338516

第一类对象(First-class Object)

这一生的挚爱 提交于 2019-12-09 23:23:58
In programming language design, a first-class citizen (also object, entity, or value) in a given programming language is an entity which supports all the operations generally available to other entities. These operations typically include being passed as a parameter, returned from a function, and assigned to a variable. 第一类对象(First-class Object)在1960年由Christopher Strachey 发明,原来称之为第一类公民(First-class citizen),意思是指函数可以作为电脑中的第一类公民。英文中也称之为First-class entity或First-class value。 定义 第一类对象不一定是指面向对象程序设计中所指的对象,而是指程序中的所有实体 (比如:变量、函数、队列、字典等等)。一般第一类对象具有一下特征: 可以被存入变量或其他结构 可以被作为参数传递给其他方法/函数 可以被作为方法/函数的返回值

纯函数式堆(纯函数式优先级队列)part two ----斜二项堆

混江龙づ霸主 提交于 2019-12-09 10:10:09
前言: 这篇文章是基于我看过的一篇论文,主要是关于函数式数据结构,函数式 堆( 优先级队列), 我会以自己的理解写下来,然后论文中出现的代码 将会使用scala这们语言。 论文链接: Optimal Purely Functional Priority Queues ,另外一个链接: 论文。 正文: 紧接part one的内容,接下来进入斜二项堆。 斜二项堆 (skew binomial queue) : 斜二项堆支持插入操作 O(1) 的时间复杂度,通过借用 random-access lists 中的技术来消除上述的连续 进位问 题。 为了解决这个问题,我们先来了解斜二进制数(Skew binary number),斜二进制最多只有一次进位。 斜二进制数 (Skew binary number) : 同二进制不同的地方在于,斜二进制数第k个数字代表2^(k+1) - 1(2的k+1次方减一),而不是 二进制的2^k。 每个位上的数字是0或者1,而二进制不同的是,最低非零位可以为2。 下面是二进制与斜二进制对应的 位置的 权值 对比: 从最低为开始: 0 1 2 3 4 5 6 7 8 ..... 斜二进制: 1 3 7 15 31 63 127 255 1023 ..... 二进制: 1 2 4 8 16 32 64 128 256 .....

纯函数式堆(纯函数式优先级队列)part one ----二项堆

谁说我不能喝 提交于 2019-12-09 10:09:52
前言: 这篇文章是基于我看过的一篇论文,主要是关于函数式数据结构,函数式 堆( 优先级队列), 我会以自己的理解写下来,然后论文中出现的代码 将会使用scala这们语言。 论文链接: Optimal Purely Functional Priority Queues ,另外一个链接: 论文。 这里有个好网站介绍: coursera ,全球在线课程,各种课程都有。 scala这们语言的一些学习资料: scala的教程: scala turorials (文档和更高阶的教程这个网站上都有), 这里有一个有趣的(讲的很有趣值的一看)介绍scala的视频: Scala for the Intrigued , 这里还有scala作者Martin Odersky在youtube上的一个视频, 主要是介绍scala这个语言是如何应对和处理并行计算所带来的挑战(youtube需翻墙): Martin’s talk at OSCON 2011: Working Hard to Keep it Simple 。 正文: 好了,我们回到正文。 我们知道 堆可用来实现优先级队列,或者说堆就是一种优先级队列。论文中的优先级队列 (priority queue), 其实也就是堆(heap),反正都是差不多的东西,我还是写成堆吧。 论文中的讨论的堆支持以下4个操作: 1、findMin(h)

转向一门更加高级的语言Lisp

≯℡__Kan透↙ 提交于 2019-12-06 21:25:10
以前一直习惯了C语言的使用与思维习惯。但是现在看来,C语言还是很低级,所以再学一门更加高级的语言,对我而言,有三个选项:shell,python和lisp;我刚刚看完Common Lisp的语法部分,所以以后可能会深入学习Lisp,争取有朝一日使用Lisp处理手上的工作和作为研究兴趣的工具。 现在将过去的学习总结如下: Lisp语言的语法很简单,很一致,即使加上CLOS也是如此: (operator argument*) 如果有一个emacs下的slime这样的开发环境,细节的语法根本不用死记。 下面是主体: the root of lisp可以帮助你了解他的优雅,至于他的强大,我还没有真正的需要他,所以没有切身的体会,Lisp的拥护者如此忠诚,所以说实在的,我想看个究竟。哈哈! 最开始学习Lisp会感觉别扭,这是思维习惯问题;然后是难理解(即使不再别扭),我看来理解Lisp的关键是理解符号:symbols are really objects。这样函数和变量可以同名而不混淆(当然函数是动词,变量是名词,没有必要重名),初次见到真是惊呆了。 还有,我觉得Lisp的package管理机制很棒,足够。权限控制毫无必要,所以C++,Java的权限机制实践中没有多大意义,有无皆可。 更多的以后记述! 来源: oschina 链接: https://my.oschina.net/u

erlang 学习资源

青春壹個敷衍的年華 提交于 2019-12-04 22:24:41
Erlang语言绝对算得上是一种“小众”语言,但其未来的发展前景却是无法估量的,因为它可以解决传统语言很难解决的并行计算中的难题。Erlang是一种函数式(变量只能赋值一次)、强类型、动态类型(变量类型在运行时决定,代码需要编译后才能执行,与 Python,Ruby等不一样)、面向并发(Concurrency Oriented)的语言。最近公司有个项目刚好要用Erlang来开发,对这个语言产生了强烈的兴趣,下面收集一些Erlang常用的学习资源: Getting Started with Erlang. 开始使用Erlang Erlang Course . Erlang学习课程 Best practices for Erlang development : Erlang开发的最佳实践,推荐阅读,因为这篇文章介绍了一些不同的Erlang哲学,例如为什么Erlang不鼓励 “programming defensively” . Erlang教程:如何使用Erlang OTP创建应用 how to build an OTP application in Erlang . Thinking in Erlang , 思考Erlang,一个非常优秀的30页的面向C/C++/Java/Python,未曾使用函数式编程的开发者的介绍。 书写了务实编程(Pragmatic Programmer

Python函数式编程:从入门到走火入魔

纵饮孤独 提交于 2019-12-03 11:26:51
函数式编程源自于数学理论,它似乎也更适用于数学计算相关的场景,因此本文以一个简单的数据处理问题为例,逐步介绍 Python 函数式编程从入门到走火入魔的过程。 很多人都在谈论函数式编程(Functional Programming),只是很多人站在不同的角度看到的是完全不一样的风景。坚持实用主义的 Python 老司机们对待 FP 的态度应该更加包容,虽然他们不相信银弹,但冥冥中似乎能感觉到 FP 暗合了 Python 教义(The Zen of Python)的某些思想,而且既然 Python 是一门多范式编程语言,并在很大程度上支持函数式编程,那就更没有理由拒绝它。 函数式编程源自于数学理论,它似乎也更适用于数学计算相关的场景,因此本文以一个简单的数据处理问题为例,逐步介绍 Python 函数式编程从入门到走火入魔的过程。 问题 :计算 N 位同学在某份试卷的 M 道选择题上的得分(每道题目的分值不同)。 首先来生成一组用于计算的伪造数据: # @file: data.py import random from collections import namedtuple Student = namedtuple('Student', ['id', 'ans']) N_Questions = 25 N_Students = 20 def gen_random_list(opts,

Clojure: 实现简单的数学表达式计算

左心房为你撑大大i 提交于 2019-11-30 00:48:18
我之前在知乎上回答了问题 按照运算符优先数法,画出算术表达式求值时,操作数栈和运算符栈的变化过程 。这次一方面也算是温故而知新,另一方面借此领略Clojure函数式编程之美。为了节省篇幅,本文只考虑 +、-、*、/ 这几种基本运算符以及只考虑小于10的整数运算。 栈变化图示 我们人类使用的算术表达式是中缀表达式,而计算机采用后缀表达式,也即逆波兰式。第一种方式是将表达式转为后缀表达式,再进行求值;第二种方式是直接对中缀表达式进行求值。本文就直接采用第二种方式了。 比如要对表达式 9-2*4+9/3 进行求值。首先需要使用2个栈来分别保存运算数和运算符,分别记为 opnd 和 optr。对表达式逐家符读入: 1、读入字符 '9',因为是运算数,则放入 opnd 栈中,剩余待读入字符串为:-2*4+9/3,此时 opnd 栈和 optr 栈如下图所示: 2、读入字符 '-',发现是运算符,则先和 optr 栈顶作比较,因为 optr 栈是空栈,故直接入栈 optr。剩余待读入字符串为:2*4+9/3,此时 opnd 栈和 optr 栈如下图所示: 3、接下来读入字符'2',发现是运算数,则入栈 opnd,剩余待读入字符串为:*4+9/3,此时opnd 栈和 optr 栈如下图所示: 4、接下来读入字符 '*',发现是运算符,则跟 optr 栈顶字符 '-' 进行比较,'*' 优先级高于