动力点javaFunctionaProgrammingJargon函数式编程术语解释

上传人:ji****72 文档编号:45831352 上传时间:2018-06-19 格式:PDF 页数:13 大小:277.65KB
返回 下载 相关 举报
动力点javaFunctionaProgrammingJargon函数式编程术语解释_第1页
第1页 / 共13页
动力点javaFunctionaProgrammingJargon函数式编程术语解释_第2页
第2页 / 共13页
动力点javaFunctionaProgrammingJargon函数式编程术语解释_第3页
第3页 / 共13页
动力点javaFunctionaProgrammingJargon函数式编程术语解释_第4页
第4页 / 共13页
动力点javaFunctionaProgrammingJargon函数式编程术语解释_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《动力点javaFunctionaProgrammingJargon函数式编程术语解释》由会员分享,可在线阅读,更多相关《动力点javaFunctionaProgrammingJargon函数式编程术语解释(13页珍藏版)》请在金锄头文库上搜索。

1、动力节点 javaFunctional Programming Jargon:函数式编程术语解释本文的主要目的即是希望能够有一种通俗易懂的方式来阐述函数式编程中常见的理论术语概念Arity:参数数目Arity 代指一个函数的参数数量,该关键字来源于类似于 unary、binary、ternary 等等,由两个后缀-ary、-ity 组成。譬如,如果一个函数允许输入两个参数,那就称为所谓的 binary function(二元函数),或者一个有两个参数的函数。有时候这种函数也会被喜欢拉丁语法的人称为”dyadic(二价的)”函数。以此类推,不定参数的方程也就被称为 variadic(可变参数函数

2、)。const sum = (a, b) = a + b;const arity = sum.length;console.log(arity);/ = 2/ The arity of sum is 2Higher-Order Functions (HOF):高等函数一个接收某个函数作为参数的函数成为高等函数, 该函数可以选择返回一个函数也可以返回其他类型const filter = (pred, xs) = const result = ;for (var idx = 0; idx x = Object(x) instanceof type;filter(is(Number), 0, 1,

3、2, null); /= 0, 2Partial Application:局部封装将原本一个多参数值的函数封装为固定参数数目的函数的过程称为 Partial Applicationlet sum = (a, b) = a + b;/ partially applying a to 40let partial = sum.bind(null, 40);/ Invoking it with bpartial(2); /= 42Currying将一个 N 参数值的函数转化为 N 个一元函数的组合, Currying 与Partial Application 的区别在于 Partial Applica

4、tion 最终生成的函数允许接收多个值,而 Currying 生成的函数序列中的每个函数只允许接收一个参数let sum = (a, b) = a + b;let curriedSum = (a) = (b) = a + b;curriedSum(40)(2) / 42.Composition:组合感觉有点像设计模式里的 Decorator, 即能够将两个指定类型组合转化为一个新值的函数最常见的组合即是常见的函数组合,允许你将不同的函数组合成一个返回单值的函数const compose = (f, g) = a = f(g(a) / Definitionconst floorAndToStri

5、ng = compose(val)= val.toString(), Math.floor) /UsagefloorAndToString(121.212121) / “121“Purity:纯函数一个没有任何副作用, 并且返回值只由输入决定的函数成为纯函数let greet = “yo“;greet.toUpperCase(); / YO;greet / yo;As opposed to:let numbers = 1, 2, 3;numbers.splice(0); / 1, 2, 3numbers / Side effects:副作用如果一个函数,除了返回值之外,还会修改某些其它状态,或

6、者与外部函数等有可观测的交互console.log(“IO is a side effect!“);Idempotency:幂等性多次执行下都不会产生副作用的函数被称为具有幂等性的函数f(f(x) = f(x)Math.abs(Math.abs(10)Point-Free Style那些并没有线性定义参数的函数风格被称为 Point-Free Style,这类型往往需要 currying 或者 Higher-Order functions。/ Givenlet map = fn = list = list.map(fn);let add = (a, b) = a + b;/ Then/ Not

7、 points-free - numbers is an explicit parameterlet incrementAll = (numbers) = map(add(1)(numbers);/ Points-free - The list is an implicit parameterlet incrementAll2 = map(add(1);incrementAll 明确规定了参数 numbers, 而 incrementAll2 是对于参数的封装,并没有显性说明 numbers 参数,因此它可以被称为 Points Free。一般来说,Points-free的函数都不会用常见的

8、function 或者=关键字来定义。Contracts暂无Guarded Functions暂无Categories:分类关联到遵循某些规则的函数的对象,譬如 monoidValue:值计算中常用到的一些复合值(complex)或者简单值(primitive),包括函数。一般来说,函数式编程中的值都被认为是不可变值。5Object.freeze(name: John, age: 30) / The freeze function enforces immutability.(a) = a注意,譬如 Functor, Monad 这样包含其他值的结构体本身也是值,这就是说,这些复合值也可以相互

9、包含。Constant:常量对于一个值的不可变引用,不能跟变量相混淆。Variable 即指那些可能在任意点呗更改的引用。const five = 5const john = name: John, age: 30常量一般认为是透明的,也就是说,它们可以被值本身代替而不影响最终的计算结果,上面的两个常量也可以用下述方式表述:john.age + five = (name: John, age: 30).age + (5)上述表达式会一直返回真。FunctorFunctor 即指那些可以引用 map 函数的对象,JavaScript 中最简单的函数就是 Array。2,3,4.map( n =

10、n * 2 ); / 4,6,8假设 func 构造为一个实现了 map 函数的对象,f、g 则是任意的函数,只要 func 遵循以下规则就可以将 func 称为一个 functor:Let func be an object implementing a map function, and f, g be arbitraryfunctions, then func is said to be a functor if the map function adheres to thefollowing rules:func.map(x = x) = func以及func.map(x = f(g(

11、x) = func.map(g).map(f)我们将 Array 称为 Functor,也是因为它遵循了以下规则:1, 2, 3.map(x = x); / = 1, 2, 3以及let f = x = x + 1;let g = x = x * 2;1, 2, 3.map(x = f(g(x); / = 3, 5, 71, 2, 3.map(g).map(f);/ = 3, 5, 7Pointed Functor实现了 of 方法的 Functor,Of 会将任何单值转化为一个 FunctorPointed Functor 在 Array 中的实现为:Array.prototype.of =

12、 (v) = v;.of(1) / 1LiftLift 很类似于 map,不过它可以用于多个 Functors:在单值函数下,Map 与 Lift 的作用是一致的:lift(n = n * 2)(2,3,4); / 4,6,8而 Lift 可以允许输入多个值:lift(a, b) = a * b)(1, 2, 3); / 3, 6Referential Transparency:透明引用一个可以直接用其值来替换而不会影响到程序表现的表达式称为透明引用譬如我们有一个叫 greet 的引用let greet = () = “Hello World!“;任何对于 greet()的调用都可以被 Hel

13、lo World!直接替换,因此可以将greet 称为透明引用。Equational Reasoning当一个应用由表达式组合而成并且没有任何副作用的时候, 该系统可以由部分推导而来Lazy evaluation:懒计算Lazy evaluation 即是所谓的只有在需要某个值的时候才进行计算的机制。在函数式语言中,这个机制就允许对于那些近乎无限的列表进行操作。let rand = function*() while(1 a.split(,) / cat,dog,fish,bird/Contrast to mapcat,dog,fish,bird.map(a = a.split(,) / ca

14、t,dog, fish,birdYou may also see of and chain referred to as return and bind (not be confusedwith the JS keyword/function) in languages which provide Monad-likeconstructs as part of their standard library (e.g. Haskell, F#), on Wikipedia and inother literature. Its also important to note that return

15、 and bind are not part ofthe Fantasy Land spec and are mentioned here only for the sake of peopleinterested in learning more about Monads.Comonad:余单子实现了 extract 与 extend 函数的对象let CoIdentity = v = (val: v,extract: this.v,extend: f = CoIdentity(f(this)Extract 可以将值从 Functor 中吐出来:CoIdentity(1).extract() / 1Extend 则是会返回一个跟 Commonad 相同值的函数:CoIdentity(1).extend(co = co.extract() + 1) / CoIdentity(2)Applicative(可适用的) Functor一个 Applicative Functor 就是一个实现了 ap 函数的对象, Ap 可以将某个对象中的某个值转化为另一个对象中的相同类型的值(a)= a + 1.ap(1) / 2Morphism:态射一个转化函数Isomorphism:同态转换用不同方式存储的能够表明相同数据的转换譬如,一个二维的数组可以存储为数组:2,3或者对象:x: 2

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号