Tag: Functor

Swift中用于像我这样的傻瓜的功能组合-第3部分

如您所见, Array每个值都由传递给map的函数转换。 我经常看到的一个错误是,认为 map 是用于集合的操作 。 它对于集合当然是有用的,但是将地图视为对集合进行操作的一种方式将您限制为集合类型。 在Swift中,Swift标准库中有一些针对Optional和Result类型的map函数,一旦您开始认识到它们在哪里有用,就可以为系统中定义的许多其他类型定义map 。 Optional和Result都不是集合,并且它们都是可map 。 两者还具有无法映射的状态。 当Optional为nil ,由于没有值,它无法将提供的转换函数应用到map函数,因此map跳过执行转换函数,而Optional值保持为nil 。 这种行为非常类似于Swift可选绑定的工作原理,但是没有所有样板。 首先,使用可选绑定而不是map的示例: 接下来,是一个使用Optional的map实现来完成相同任务的示例。 最后,一个使用“可选”的“ map”实现的示例显示,当“可选”为nil时,跳过了转换。 以类似的方式,新的Swift 5 Result类型中包装的值如果为.failure ,则无法进行转换,因此将跳过转换函数,并且一系列操作的结果将为.failure 。 这在组成一系列动作时非常有用,在这些动作中,您仅希望在前面的步骤成功后才执行该动作。 我将回到这一点,并在本文中进一步扩展。 以下是一些片段,展示了map如何在Result类型上工作: 所有这些的最终结果是,您可以将依赖于先前操作结果的操作链接在一起,而无需使用嵌套的ifs。 map函数将正确调用或跳过转换。 但是,这些示例中潜伏着一个问题。 如果Optional map中的转换函数产生另一个Optional ,则结果为Optional<Optional> ,即嵌套的Optional 。 完全有效,但很难处理。 在以下示例中查看有效内容的类型: 有一种避免这种嵌套的解决方案,在Swift(和其他(但不是全部)功能语言)中称为flatMap 。 Monad简介—认为可映射和可平面映射 和以前一样,请随时在线搜索Monad的完整定义。 范畴论的定义很难解析。 为了便于讨论,您需要知道的是Monad是包装类型,它具有flatMap函数和map函数。 flatMap函数将特定类型的转换函数(或态射)作为参数,并将该转换应用于包装的一个或多个值。 特定的转换是一种输入类型与包装类型相同且输出类型与Monad本身相同但包装一个转换值的转换。 换句话说,形状为(A) -> M ,其中M表示为FlatMapped的Monad类型。 换句话说, Optional上的flatMap期望形状为(A) -> Optional的转换函数, Result上的flatMap期望形状为(A) […]