函数柯里化有什么用,函数柯里化
浅墨镜的概念在函数式编程相关的文章中,经常可以看到“Currying”这个词。它是由数学家哈斯克尔库里提出的。
晕影,一句话解释,就是把多参数函数转化为单参数函数的方法。
这是一个带有两个参数的普通函数:
Function plus (x,y) {return x y} plus (1,2)//输出3经过光线明暗处理后,这个函数变成这样:
plus(y){ return function(x){ return x y } } plus(1)(2)//output 3刚开始接触复合函数和暗沉的时候,第一感觉有点类似wjdyg系列的资料片,然后就去高数的书里面看。其实不然:)其实只要是编程相关文章中提到的明暗处理,都是指将多参数函数转化为单参数函数的方法。不过文中顺带提到了光影的由来,再加上Haskell的高级编程语言,总觉得这是一个如此复杂的公式。
复合函数,中学数学课本上都有(我忘了是高中还是初中,反正大学学的也忘了:P)。表单是这样的:
$$F(x)=f(g(x))$$
你可以这样理解这个函数。从Xi到北京,你可以乘直达车或者从郑州转车。$$F(x)$$是全程,$$g(x)$$是从Xi安到郑州,$$f(x)$$是从郑州到北京。如果公式是用编程语言表达的,就是这样:
Travel(point 2){ let dest= Beijing return function(point 1){ return point 1 - point 2 - dest } } Travel(郑州)( Xi 安)//输出Xi 安-郑州-北京的懒评。从上面的代码来看,幽幽墨镜的功能是一步步执行的。第一次调用返回一个函数,第二次调用只会计算它。发挥延时计算的作用,通过延时计算来评估,这就是所谓的懒评估。
如果动态生成函数在实际编程中需要要求几个无理数的幂次(整数),可能需要要求两个幂次,或者四个幂次或者其他幂次。如果不需要浅色墨镜,需要要求几个度数,那就得写几个对应的方法。透过一抹墨镜,可以用一种方法写出来:
函数幂(n){返回函数(数){ let result=1;for(设I=0;I n;i){结果*=数字;}返回结果;}}需要平方时,可以直接生成平方方法。
设p2=幂(2);P2(4) //Output 16p2(5) //Output 25同样,如果需要求正方体,也可以直接生成求正方体的方法,而不用为每一次幂都写一个方法。
设p3=幂(3);//求立方p3(2) //输出8p3(4) //输出64。前端圈的讨论很多,但大部分都只是初学者。看看专业人士对封闭概念的解释,很复杂:
闭包包含自由(未绑定到特定对象)变量;这些变量不是在这个代码块或任何全局上下文中定义的,而是在定义代码块的环境中定义的(局部变量)。“闭包”这个词来源于下面两个的组合:要执行的代码块(因为代码块中包含了自由变量,所以这些自由变量及其引用的对象没有被释放)和为自由变量提供绑定的计算环境(作用域)。
这一大段话浓缩成一句话:在函数内部定义一个局部变量,通过函数返回。详细地说,上面提到的动态生成函数中使用的例子是一个闭包函数。
从形态上来看,浅色墨镜和闭包很像。两者是什么关系?
没关系,只是看起来像而已。事实上,网上大部分文章都是把轻墨镜和封闭分开讨论的,几乎没有明确说明两者之间是什么关系。首先,这是两个不成立的概念。根据定义,它们具有不同的功能。只使用匿名函数。
浅色阴影和Lambda表达式浅色阴影通常与$ $$(Lambda)表达式一起使用。提到Lambda表达式,就不得不提到匿名函数。
匿名函数在底层语言中并不容易使用。比如C语言就没有匿名函数。因为C语言要在调用之前声明函数,或者在调用之前定义函数,所以无法谈匿名函数:P,C 11引入了Lambda表达式,支持匿名函数。所以有些资料有时候直接把匿名函数等同于Lambda表达式。
有一种观点认为:
从纯语义的角度来说,一抹墨镜就是Lambda表达的糖。
实际上,Lambda在这里被视为匿名函数。严格来说,并不是所有的匿名函数都是Lambda表达式。C# 2.0引入了委托和匿名函数,3.0之后引入了Lambda表达式。
列表。其中(delegate(object item){ return item!=null});这是委托书的写法。
列表。其中(item=item!=null);Lambda就是这么写的。(我想在这里补充一下,经过我自己的实践,Lambda表达式其实是可以用在的平台上的。NET 2.0,但在编译时,会调用高版本的编译器,所以在项目中使用高版本的C#特性。NET 2.0在编译和运行上不会造成任何问题。)
Lambda表达式有固定的规范。写成lambda x. body(前缀args分隔符表达式)来表示一个带参数x的函数,它的返回值是body的计算结果。Lambda表达式的形式在不同的语言中是不同的,比如Python:
Lambda x: x 1前缀是可选的,比如Java。
物品-物品!=null所以,淡淡的底纹与Lambda表达式无关。
Lambda表达式中细微阴影的应用从上面的观点来看,纯Lambda表达式的规范只是一个参数。如果有多个参数呢?
浅色墨镜的效果才能体现出来。例如,要实现两个数之和的表达式,用一个纯Lambda表达式,可以写成这样:
let foo=(x)={ return y=x y } foo(1)(2)//Output 3这么明显麻烦,实际上是这么写的。
设foo=(x,y)=x yfoo(1,2) //实际写出的输出3是否不符合Lambda表达式的规范?
可以理解为第二种写法是第一种写法的缩写,是语法糖,第一种单参数写法是脱糖形式。