当前位置: 首页 > Web前端 > HTML

函数式编程:Flutter&Dart中的组合

时间:2023-03-28 16:30:00 HTML

什么是组合?dictionary.com中对组合的定义是:将部分或元素组合成一个整体的行为。简单来说,组合就像是把乐高积木堆在一起,我们可以把积木拼成一个结构。在FP中,我们定义了一个简单的通用函数,它可以组合成一个复杂的函数,一个函数的输出是另一个函数的输入,等等。输入从一个函数传递到另一个函数并返回结果。因此,组合可以被认为是数据流动的管道。组合的数字符号是f.g.f(g(x))它由内而外执行。首先x被初始化。将x作为参数传递给g,g(x)被初始化。计算g(x)并将结果传递给f函数,最终计算出f(g(x))。在Dart中,一个compose函数可以表示如下:Compose是一个高阶函数,它接受两个函数并返回一个接受其输入的函数。组合从右到左执行,因此先执行g,然后执行f。函数shout的创建如上所示,它由两个更小的功能函数toUpper和exclaim组成。第4行,结合这两个函数创建了shout函数。第8行使用Dartz包中提供的函数composeF。如何在Flutter中使用组合?Flutter框架是展示组合功能的最佳示例之一,我们在其中为UI设计组合控件。比如你要设置padding,可以用Padding来组合。如果你想设置一些装饰,你可以使用DecoratedBox来组合它等。Flutter大量使用组合。控件树是我们的UI组合方法的结果。控件就像乐高积木,小的通用控件可以组合成复杂的控件或用户界面。比如Container中包含了Padding、DecoratedBox、Align、LimitedBox等几个控件,这里着重介绍组合在实践中的应用,让读者对组合的概念有更深入的理解。从本质上讲,Flutter中的控件组合与函数式编程中的组合有些不同。这两种编程范式是不同的。Flutter中控件的组合侧重于面向对象编程,对象是基本单位,控件都是对象;而函数组合侧重于函数式编程,无状态函数是基本单元。Composition和pipeline类似于compose,这里多了一个概念:pipeline。两者的区别在于composition执行顺序是从右到左,而pipeline执行顺序是从左到右。这种区别特别重要,不应忽视,因为它会间接影响代码的可读性。中国人的阅读习惯是从左到右。如果你是阿拉伯人,可以无视我说的,哈哈!第14行,使用了compose,它的执行顺序是从右到左,函数g先执行,结果传递给f。第17行,使用了流水线,它的执行顺序是从左到右,函数f先执行,结果传递给g。如果使用compose,输入10执行increment到11再乘以2,所以执行结果为22如果使用pipeline,输入10执行doubler乘以2变成20,再执行increment增加到21并返回。ExampleExample结合我们所学的概念,我们可以创建几个函数来实现字符串的转换。我们需要可以将上述用例相互转换的功能。就像乐高游戏一样,您首先需要乐高积木,在这种情况下,我们需要具有一些基本功能的函数。之前定义的Compose函数只接受两个函数作为参数,现在定义一个可以接收n个参数的函数。我们创建了上面的代码,然后可以用它来实现更多有趣的功能,这些功能会用到,可以通过Githubrepository查找更多信息。SnakecasetoPascalcase接下来将从Snakecase转换为camel、pascal和kebabcase。const\_pascalCase='LoremIpsumDolorSitAmet';const\_snakeCase='lorem_ipsum_dolor_sit_amet';第5行定义了_snakeToPascal函数,它接受一个参数并返回结果。_snakeToPascal由三个小函数组成:splitWithUnderscore、capitalizeWords和joinWithoutSpace。将“lorem_ipsum_dolor_sit_amet”作为参数传入函数,compose从右到左执行。所以:首先将输入字符串传递给splitWithUnderscore,它将输入拆分为["lorem"、"ipsum"、"dolor"、"sit"、"amet"]。splitWithUnderscore的返回值是一个数组,会传给第二个函数,capitalizeWords将每个元素的首字母转为大写,返回列表["Lorem","Ipsum","Dolor","Sit","阿梅特”]。capitalizeWords的返回结果将传递给joinWithoutSpace,它将元素连接在一起并返回结果“LoremIpsumDolorSitAmet”还记得我们之前说过的吗?我们通过组合为数据定义一个管道,就像上面那样。数据流经这些管道并返回结果,在花时间构建一些基本功能后,组合它们以产生更有意义的功能变得容易。蛇形案例到骆驼案例const\_snakeCase='lorem_ipsum_dolor_sit_amet';const\_camelCase='loremIpsumDolorSitAmet';第15行_snakeToCamel很简单,第一个和最后一个函数和上面的转换一样:splitWithUnderscore和joinWithoutSpace,将中间函数从capitalizeWords变成capitalizeTail,我们的功能就实现了。原因是camelCase的大小写不需要首字母大写。capitalizeTail与capitalizeWords类似,但它忽略了与我们的用例匹配的首字处理。SnakecasetoKebabcase将Snakecase转换为kebabcase更容易。您只需要组合两个函数(splitWithUnderscore和joinWithHyphen)即可完成任务。CamelcasetoothercasesKebabcasetoothercasesPascalcasetoothercases想法我喜欢将组合视为一种分而治之的技术。组合的主要优点是高可重用性和可定制的功能。文章GitHub中的源码地址很棒!鼓励自己坚持下去。我希望我为您投入的时间增加了一些价值。如果您觉得文章对您有帮助,点赞,收藏,关注,评论,一键四连支持,您的支持就是我创作最大的动力。??本文原文在听蝉公众号:编程黑板报欢迎关注原创技术文章,第一时间推送??