00:00
下面要给同学们讲的这个知识点呢,叫做函数颗粒化。科里化,科里化为什么叫函数科里化呢?因为有一个人他叫科in,他叫这个人叫这这个有一个人啊,有个数学家所为了纪念一个数学家叫这个术语家叫CU rry,科里库里啊,有个对吧,打篮球这叫这个,这个这个好,那么这个呃,库里啊库里这个他是干什么的,他是个数学家。它提出这么一个概念,那么我们来看看这个函数颗粒化指的是什么意思呢?首先我先给大家说了三句话,大家看一下啊,函数的编程中,接受多个参数的函数都可以转换成接收单个参数的函数。就是你将来因为我们函数参数太多了。所以说呢,有人说干脆咱们一个一个的把它函数呢,写成单个单个的传递。啊,那么这个转换的过程呢,就叫可理化。
01:03
那么颗粒化它是为了证明函数只需要一个参数而已,其实我们刚才学习的过程中已经涉及到颗粒化的操作,比如说同学们刚才看这样子,我们在调用这个MS的时候。你看在调用matters的时候,你看我们是怎么做的,我们其实是,呃,可以直接这样调用,你看最早我们是这样调的。啊,砍树。啊,是这。是这个我们在讲哪个地方哦,匿名函数。咱们在讲匿名函数的时候呢,其实大家也可以看到我们这个地方就可以一次性的调用,看这。啊逆,诶匿名函数。是不是匿名函数是呃返是高阶函数,返回一个匿名函数的时候。应该是这对对对,这个你看这个mins,你看我们传了两个参数进去,其实这个就非常像这种颗粒化的一种使用。啊,颗粒化的使用,那么函数颗粒化呢,它就是为了去说明。
02:05
它就是为了说明什么呢?函数其实一个参数就可以了,可以分开写。那么这边还有一个重要的概念呢,大家不用去设立,就刻意的去设立,诶函数个体化为什么有存在的意义,就为什么有函数个体化呢。啊,这样意义呢?呃,这个命题不用特特意的去研究,因为颗粒化是以函数为主体的,这种思想产生的必然结果就是他认为既然你这个函数是主体,对吧,那么函数力度已经很大了,那我干脆一个参数一个函数往里传递,它其实为了更更多的是为了让这个函数作为主体在。再进行传递来设计的这么一种语法。啊,所以说它是面向函数思想的必然结果。啊,所以说我们没有必要特意的函数颗粒化到底有什么用啊,没有必要去研究这个话题,那既然如此呢,我们就来直接的给大家看一下函数颗粒化的使用吧。
03:04
啊,看一下它的写法,我这里呢,有一个函数颗粒化的快速入门案例,案例是这样子的啊,请编写一个函数,接收两个整数。返回两个整数的乘积,这个对我们来说特别简单。常规的写法。哎,这都没写。用必报的方式完成。大家也会想,你看。Muli。库里可然后呢,我先传一个X,然后呢,把这个X封装到另外一个函数,到时间我在传递的时候就是19。刚刚讲过。那这个写的话有点有点麻烦,所以说人家就直接有这种写法,怎么写呢?X int y z,就相当于说你传了两个参数,我直接给你分开写放进去,这也达到了这样一个使用效果。好,这就是函数颗粒化的一个形式。很很简单啊,很简单,那么我们把前面两个我不不运行了,把这个运行一下,大家看一下就行了,函数颗粒化的一个案例。
04:07
来,走一个吧。叫。叫这个curry DEMO。你。啊零一。那么我写一个主函数,好,我简单写到这儿,大家看一下这种写法啊,就是X,它本身实际上是可以这样写的。啊,但如果你这样写,你传递的时候肯定你就不能。啊,你肯定要这样喜欢吗?啊,那么如果这个函数颗粒化呢,咱们就。可以这样去写,然后调的时候呢,也可以这样去调。啊,看起来感觉很高大上的样子,对吧,啊这这什么意思对吧,就这就这么一个意思,那么我们执行过后呢,这个就等于80。这个就等于80。好,就写完了,那么这样子讲完过后,大家肯定觉得好像,诶,这个函数颗粒化没有什么用,那么我们来一个最佳时间案例。
05:05
给大家再加强一下它的一个应用场景,Curry。DEMO02各位。来吧。那现在呢,我们来看一个案例,加深一下对他的对他的一个认识吧。好,我这有个最佳实践,这个最佳实践是这样子的啊,同学们说比较两个字符串在忽略大小写的情况下是否相等。就两个字母算给你了,到底等不等,而且呢,把这个怎么说呢,把它的这个呃大小写忽略了。那么我们来分析一下这个任务,其实这个任务呢,准确的讲,它是有两件构成的。也就是说函数颗粒化,它是崇尚一个什么感觉呢?就是说一个动作完成一件事情。啊,他是希望我们以以后这个事情呢,是一个一个的完成,就是说它很清晰,就这个做完了再做下一步,再做下一步就是像我们那个过滤在迈步,再再简化,再折叠那种感觉啊,那么他就认为你这个比较字符串大小写呢,其实是先转成大写的。
06:13
或者统一转成小写的,然后再比较。对吧,那么对于这样一个操作呢。对于这样一个操作,那就两个操作。我们可以用函数处理,就是原原先一个函数本身可以完成的事儿,变成两个函数去处理,对吧。那现在呢?我们来看一下这个函数颗粒化是怎么实现的。首先。我们先抛开函数颗粒化,我们用自己普通的方法来写,同学们每个人都能写出来,那太简单了。对吧,如果我写X1X2。这个就。这这个就是函数颗粒化的一个一个应用,但是呢,我这里没有把它拆解成两个部分。我只是很普通的写了一个颗粒化的形式。其实这个形式。
07:03
大家看到很像,就是两个参数分别掉,那么我就S1TO no,看看它等不等不等于S2TO load,这个就是最简单的写法。但是这个写法呢,并没有体现出什么呢,说把两个任务分开的这种感觉。就函数颗粒化,它它第一个是形式上是一个参数,参数的传,第二个呢,他认为是什么呢?他认为你这个地方应该把两件事情分开。只是我这个,只是我这个案例特别简单而已。都感觉不到,那现在呢,我们现在就要强制把它分开,先给我转大小写,再比较相等,你看我怎么写的。好,同学们看这个代码呢,我就写成这个就行了。显然有点。这个自找麻烦的感觉啊,我现在是怎么写呢?这个代码大家看起来肯定有点吃力啊。其实本身一件很简单的事情,我写的复杂了。为什么呢?因为我想用函数可理化的这种使用方法来,好,我先把这个写过来看一下。
08:03
这里我用到了一个概念,叫影视类。好,同学们看一下这个代码啊,可能有些同学能看懂,有些同学呢,看的有点吃力,我们来整理一下思路。第一个。跟着老师思路啊,这是一个函数,现我想到哪你就看到哪,这是一个函数干什么呢?可以接收两个字符串。比较是否相等。就这么一个任务,说他的任务就一件事,我不管你赚大小写,我就看你相不相等。完事了,紧接着呢,我在这里做了一个动作,我在这里写了一个影视类。完了影视类同学们可能已经基本上忘的差不多了啊,因为人的记忆是有限的,大家回忆一下影视类是干什么的呀?可能忘了隐私类是当我们去呃去创建一个隐私类这写的对象时,它就自动的关联了,它的方法是吧,就可以用它,如果想不起来,我们打开笔记。
09:09
当然,说实话,我放弃了,我也想不起来,那这怎么办呢?想不起来咱们就看啊,就看。好,同学们,打开我们这个笔记,我们lawyer,我们隐食类是在哪里讲的?还有印象吗?是在这个地方看笔记就显得比较重要了,在这里讲的影视类。诶,这影是里讲的是什么东西呢?我们也不看这些废话了,直接看案例,所以你看这案例他是很重要的,你看了语言,你看完了还是不会写,所以案例呢很重要,你看我这个案例,这就写了一个以类。这个以列我当时是怎么做的呢?我说哎,我溜了一个MYSQL。一。然后我就可以用I的S,这个I的S其实是人家这个以是类的方法。还记得这种写法,就是说我溜了一个乙醇列,这地方就会触发。
10:03
就是说我用一个。创建好的,就我去调他的c hello c OK,这个COK是人家本身自己的OK,所以说你自己用是呃,本身就是OK的。本身没问题,但是我尝试去使用它,一个本身没有的方法就会触发隐私机制。这个隐视机制他就去看,诶你这有没有一个隐视转换呢?他一看你这个家伙还真写了个隐私类干什么呢?可以接收一个MYSQL1的实例给你返回,返就是根据写的这个这类,这个类已做完了,过后呢就能用它了,底层是怎么实现的呢?是这句话。我当时还专门给你们看了底层代码的。是,这句话是等于d be Dollar传了这个mexicos,这个就会,这个就相当于实例化了一个,实例化了一个d be的。实例,然后你自然就可以用人家的方法,这个就是隐私类啊,大家我做了一点简短回顾,代码我就不再去写了啊。
11:03
那肯定咱们讲了这么多,你不可能说一下全部都记得住,但是呢,你要知道这儿去找就行了,好回顾我们就到这里,那现在回到这里我问大家,我这写了一个字符串,我。如果我写一个字符串,是不是我就可以用check EQ了?哎,注意啊,现在假如我写的字串。这个字算叫哈。哎,我们同学们知道史史尊这个。对象本身有这个方法吗?就是十寸本身有有没有这个check EQ没有吧,但是我这是整的一个隐私类,现在我用十寸一去掉这个方法是不是就可以了,这个大家要马上理解看马上就能叫check。是不是就来了?这就是影视类啊啊,那这个影视类呢,就相当于给我的这一个什么呢?String这个类型扩展了方法,做影视这个东西无处不在。那么我这个。
12:00
我这个隐食里做了什么事情呢?我这里写了一个方法叫check,里面首先接收了一个子菌。这个这个值这个值。就是你到时间传进去的,还有一个是S是你本身这个S就代表你这调这个check e传真S,那我做了什么事情呢?看啊,这样大家看起来就明白了。首先。我在这里在它这个check e里面完成了一个转换成小写的任务。然后我将这个比较是否相等的任务交给了另外一个函数处理,看到没有?这就有点类似于把两件事情分散到了两个函数完成。尽管我这个很简单,但是呢,它仍然把函数颗粒化的这种感觉出来了,因为函数颗粒化的最主要的目的就是说,就是说我一一个函数完成一些事情,而且接受一个参数。哎,他就想这么干。他就怎么,那么你看这里,其实这个check里面呢,我有点像。
13:03
这个自找麻烦啊,我在这里干什么呢?体现了体现了什么呢?将将比较字符串的事情啊,分解成分解成两个任务完成,两个任务完成,那分解分解成哪两个任务呢?就是这个check EQ完成一个什么呢?它完成转换。转换大小写的任务。好,那么里面呢,我们又接收了一个匿名的这么一个啊,接收一个函数,这个函数完成什么呢?比较的任务。二完成完成这个比较的任务,好就是这么一个意思,那你看我这就充分利用了,诶传一个参数S给我这个S,其实同学们看到啊,你将来传的这个S,呃,其实就是传给了他。就你你11就是这个S。
14:02
十寸一就这个S,然后呢,你这个地方切掉的时候,再传的这个SSS就它好,这样我们就可以完成比较了,来走一个十寸一大,看起来这个代码就显得比较高大上了,Check。相当于自己写了一套,然后呢,我传入一个要比较的,比如说大写的。O,哦,我把这个都大写好,这个地方呢,大家看到这里面有一个值值的下划线,说明它引用了使用到了隐视的机制,那这时候应该返回一个什么呢?就应该返回一个真。啊,返回一个针,你看这地方我们执行一下,你看到。就返回一个针。好,我们可以看到这边有有代码有错误啊,他说什么呀。呃,我们是不是还少传了一个,嗯,不好意思啊,我们就写完了,是不是忘了把人家这个函数给传过去啊,哎,这个就是很恐怖的事情啊,忘了这个事儿,怪不得人家提示你对吧,犯了错误了,人家提你是正确的啊,返回一个错,正确。啊,同学们看,这个地方就非常的简单了,就是函数可理化的感觉,就是第一个它完成一个转换,大小写第一,再把另外一个任务交给下一个函数完成。
15:11
哎,就这么一个意思,当然如果这个题放在这里呢,显然是没很无聊的一种写法。那我只是为了。说明这个函数颗粒化的一种特性讲的,那当然你将来可以在这,比如说说老师,我这个任务还有件事情呢,不是这一件事,我这还想有事直直直接整。啊,函数可理化,就是啪啪啪,我函数不停的往往下写。啊,就可以把它分解,把它分解好,这个是呃,它的一个使用,那么我这还有个简化形式,看你们能不能看懂啊,再看一个简化形式,再看一个简写形式。这个简写形式,同学们现在应该能够立马反应过来是不对的啊,同学们看,我这里写了一个这个东西,你们看懂什么意思吗?啊,我我看同学们能不能看懂啊。
16:01
这个形式,这个跟前面写的是一样的啊。这个这个可以穿,就把这个hello穿进去吧。阿勒奇,这个写法是一样的啊,你们能看懂这是什么意思吗?这个跟刚才写的是吧一样,注意啊,你你这个地方是不是要接受一个这样的,呃,这样的一个函数啊是吧,你这个函数,呃,如果我如果我不这样写,同学们我这样写你们,你们看看能不能理解啊,我不这样写,我一步一一步给你们简化出来,因为将来你会看到大量这种简写形式,不要觉得太牛逼,觉得人家很很厉害啊,其实你看这是一个字符串,它是不是相相当于这样写的。哎哎,同学们,如果我我一步步写,是不是这样写。然后把它这个扔进去。哎,同学们是这个意思吧。啊,对吧,但是因为你这个,呃,你这个进行这个影视转换的时候,他是知道你是字符串的,因为你要比较嘛,你要比较的时候,他是知道字符串,所以说这个地方的类型呢,我们可以去掉。
17:02
啊,我们可以去掉,他也不会报错。同时又因为什么呢?因为你S1和S2在这边只出现过一次,是不是,所以说这个又被拿掉了。右边打掉,然后呢,这边就用我们的下划线来替代,这就写成这个样子了。啊,大家看一下能能不能看懂。啊,就就简化成这个德行了,呃,这个写法跟刚才是完全等价的,但是呢,感觉简洁了很多,那简洁给我们带来的这个理解呢,就是要大家要绕一下,如果同学们没有学过JA网,反而是件好事,你学完这个Java过后,你老你总始终是一个转化的过程,就好像一个人他是在中国长大的,他长他应该从小到美国去。然后在在小时候就在中国和中国和这个美国切换,那么他这个语言就会学的很好,假设有一个人,这个人再牛啊,比如说现在我们这个年龄,像你们现在20多岁了,再让你们在美国待上几年,你们英语也会学的很好,但是呢,你在自然在做这个事情,都一定会有一个转换成自己那个母语的一个过程。
18:04
啊,这没办法啊,但是久了过瘾也还可以弥补好,这就是一个简写形式,我就聊到这,同样啊,这地方应该也返回一个处。二应该也返回一个除,而两个都为除。没有任何问题,诶这个没有输出。这样没有输出啊,各位同学,我把这个呢也给同学们写到这,这就是一样的效果。好,这也是一样的效果,两个都为除,那假设我把这个地方瞎写了一个好,这个呢就不相等了,这个就返回一个false。啊,这个就返回一个S,下面这个是bos上面输出好了同学们,那关于函数的这个颗粒化呢,我们就先给大家聊到这里啊,这个函数颗粒化我们就聊到这里,那现在我把这个函数颗粒化简单的再给他点评或者这个整理一下啊,大家也注意听一听。好函数颗粒化呢,我是怎么讲的呢?诶,我先挪到这个最下边。
19:01
我讲了函数的颗粒化。写到这来。先给大家板述一下标题二。首先我们说了一下函数颗粒化的基本建设的三个概念。就是,呃。他的一个基本介绍,说到这儿。哦,里面有三点。那将来你们在开发中,函数颗粒化用的多不多呢?啊,应该不会特别的多啊,应该不会特别的多啊,可能偶尔会看到这些吧,但是一定不会特别多。因为函数个体化的应用其实还是有难度的,因为他有个拆的过程,拆了然后一步,人家有时候显得很麻烦啊,很麻烦,但是呢,如果你看到别人这么去写,你还是要还是要去能看懂,至少啊。好,讲完这个东西以后呢,我们给大家来了个快速入门案例,最简单的一个案例啊,然后呢,我们来了一个,来了一个函数颗粒化的最佳实践啊,我们这样讲的,那么我们讲了一个函数颗粒化的快速入门,对吧,那我们的要求呢,是这样写。
20:05
那么我分别使用了常规方法,使用B包方法,使用颗粒化的函数形式来做的,那么我要求同学们比较了一下它的变化。对吧,啊变化呢,从形式上来说,变化还是有的,本质没有什么变化,那我把这个呢给大家复制到这里。好,这个基本介绍就说完了,紧接着呢,我们来了一个函数的颗粒化的一个这个最佳实践。最佳实践好,最佳实践我是怎么讲的呢?诶最佳实践。就是咱们实际的写了一个函数可理化的案例,对吧,它的要求是这样子的。啊,第一个全部转成大小写比较是否相等。啊,那么这个这个案例呢,就变成了一个函数颗粒化的过程,那我直接把这个函数颗粒化的代码写过来啊,那么就是函代码使用函数颗粒化,颗粒化的思想来完成任务。
21:10
他的这个任务主要是两点,第一个呢,把它一个参数一个一个的传,第二个呢,把任务分解成单独的任务。然后一步一步做,以函数为主体来完成我们的任务,好吧,好,以前就是面向对象的,是按对象来,一个对象完成一个任务,现在变成一个函数完成一个任务了,好,代码呢,我就给同学们放到这。代码我就放到这啊,同学们要看得懂。啊,这里面呢,我提示了一下,我们这是引用到了一个隐私类,这点如果想不起来的同学就去看一下啊,原先讲的代码啊,想不起来怎么使用可以啊,可以参看参考前面啊前面讲解的对吧内容。好,同学们,那关于函数可理化,我们就讲这些。
我来说两句