Tag: 函子

Swift地图之外的世界

在这篇文章中,我将谈论一些我们在Swift中很少听到的东西: 应用函子。 这些使我们可以用最少的代码执行一些非常强大的操作。 这使用的是我上次介绍的HKT(高级类型)框架的扩展和简化版本。 我们看过Swift中的Functors : 总而言之 , Functor是“容器”(例如Array或LinkedList之类的序列),它们具有一个称为fmap的超能力映射 ,该映射可转换容器的内容,但使容器本身保持完整。 即使您从LinkedList中的数据开始,常规映射也会始终返回Array。 在本文中,我们将进一步介绍这个想法。 fmap (和标准库中的普通地图 )在某些方面非常有用 ,但肯定会受到限制。 例如,当您想使用具有多个参数的函数来转换容器时会发生什么? 这是我们可以使用应用函子解决的问题。 守则 和以前一样,代码可以在游乐场(包括一些挑战!)和XCode项目中使用,以添加到自己的代码中。 污染数据 通过一个激励性的示例,假设我们正在编写一个Web应用程序来计算退休储蓄。 由于这是公共应用程序,因此我们担心我们可能会传递恶意数据。 处理此问题的一种方法是将所有外部Web数据视为已污染 (就像Ruby一样)。 然后,我们就有一个干净的过程来检查数据并将其标记为安全 。 在Swift中,让我们使用枚举为WebData建模: (因为我们正在使用上一篇文章中的HKT框架,所以存在可构造的一致性和TypeParameter ) 有趣的是,受污染的数据无处不在-任何一个输入被污染的函数都会有一个受污染的输出(或者等效地,只有所有输入都是安全的,函数的输出才是安全的) 因此,假设我们有一个普通函数,该函数接受3个输入并计算一个输出。 接下来,我们从网络上获得此功能的3个输入: 我们要做的是使用这些输入来运行退休金计算; 但返回一个WebData值,该值仅在所有输入都安全的情况下才是安全的 。 这是一种实现方法,其中包含一个很大的switch语句。 这行得通,但是有很大的缺点:它的功能很长(因为有3个参数,所以要在开关中测试2³= 8个组合); 我必须专门为WebData编写函数(而原始函数仅使用常规的Int,Double等); 我将对我要在应用程序中使用的每个功能重复练习。 但是, WebData是一个可应用的函子 -我们将在稍后看到它的含义-因此,我们可以免费使用HKT框架(或多或少)提供的一些帮助程序功能。 在这种情况下,我们将使用框架中的Appl3 , 将3个参数的函数应用于3个应用函子的列表。 这样,我只需一行代码即可获得与长switch语句相同的效果, 而不必更改我的原始功能。 假设我们现在清除一些数据: 对于那些喜欢“延续风格”的人,您也可以使用它,它允许具有任意数量的参数的功能: 如您所见,这比您自己解包WebData容器要简单得多。 这也是可以用于许多其他类型的技术。 稍后我们将看到一些示例。 但是首先,让我们更详细地解释应用函子。 […]

函数式编程:使用Swift

在技​​术行业中,有一种关于编程范例的炒作,对于许多人来说,这是很难理解的:函数式编程。 我不会介绍函数式编程起源的技术性。 因为真的吗 谁在乎? 我们将讨论的是函数式编程,这是通过Swift带来的荣耀。 每个人都知道FP的基础知识:基于函数的编程。 我将以这种基本理解为基础。 在我们深入探讨任何事物之前,让我先列举一下使用FP的原因,这将使FP更好地了解(并且在您难以理解事物时,可以帮助您避免自杀)。 函数式编程的原因 责任划分:由于您编写的所有内容都是基于功能的,因此它可以帮助团队在处理某个功能时更好地进行分工和征服。 因为在FP中,一个功能只能做一件事,而只能做那件事。 松散耦合:在OOP中,我们将类和对象作为构建基块。 每个行为都集中在一个对象中。 所有对象相互连接并相互依赖以执行完整功能。 这导致高耦合。 FP具有独立的功能,可促进松耦合。 可测试:由于上述原因,在OOP中进行测试变得困难。 FP可以轻松解决该问题。 可重用:FP功能如前所述是独立的,这有助于一遍又一遍地使用功能而无需重写。 减少冗余代码 可读性和可维护性:FP允许将代码划分为不同功能所执行的功能。 这消除了混乱和意大利面条的代码,有助于维护和理解代码库。 可追溯性:在FP中,功能是自包含的,因此是独立的。 因此调试和错误解决变得容易。 他们如何自我约束? 我会尽快告诉你 并行性:FP有一个无状态编程原理,我将在下面定义。 它要做的是获取要读取的每个资源的副本,而永远不会在该资源上写入。 这消除了死锁的可能性,并促进了并发操作。 什么是FP? FP遵循三个基本原则: 不变性:FP促进常数。 建议确保您的变量完全不改变值。 还是不经常,如果不可能的话。 无状态编程:FP中的任何功能都不会改变其外部程序/系统的状态。 如果函数将变量的状态更改为超出其自身范围,则它不是FP函数。 无副作用:通过上述行为,FP确保系统所做的一切对系统的任何其他部分均没有影响。 没有意外的数据行为,没有无法追踪的值变化。 这样可以确保每个功能都是独立的和独立的。 我们将在Swift中使用FP涵盖什么 在本节中,我们将讨论FP功能以及Swift中如何支持它们。 代数数据类型 模式匹配 功能 函子 应用程式 因此,现在您可以跳到您感兴趣的标题,而无需全部阅读。 代数数据类型 代数数据是通过组合其他类型而形成的类型。 考虑以下枚举,以供将来使用: 枚举NHLTeam {case canadienscase参议员case rangerscase企鹅caseblackHawkscase首府} enum […]