解释一些函数式编程中的专用术语和一些常⻅模式,比如函子 (Functor)、适用函子 (Applicative Functor) 和单子 (Monad) 等。理解这些常⻅的模式,会有助于设计自己 的数据类型,并为 API 选择更合适的函数。

函子

目前已经遇到了几个被命名为 map 的方法,类型分别如下:

extension Array {
func map<R>(transform: (Element) -> R) -> [R]
}
extension Optional {
func map<R>(transform: (Wrapped) -> R) -> R? }
extension Parser {
func map<T>(_ transform: @escaping (Result) -> T) -> Parser<T>
}

每个 map 方法都需要两个参数:一个即将被映射的数据结构,和一个类型为 (T) -> U 的函数 transform。对于数组或可选值参数中所有类型为 T 的值,map 方法会使用 transform 将它们转换为 U。这种支持 map 运算的类型构造体 —— 比如可选值或数组 —— 有时候也被称作函子 (Functor)。

函子也会被描述为一个储存特定类型值的 “容器”。而 map 方法则用来对储存在容器中的值进行转换。

适用函子

除了 map ,许多函子还支持其它的运算。

对于任意的类型构造体,如果可以为其 定义恰当的 pure 与 <*> 运算,就可以将其称之为一个适用函子 (Applicative Functor)。或 者再严谨一些,对任意一个函子 F,如果能支持以下运算,该函子就是一个适用函子:

func pure<A>(_ value: A) -> F<A>
func <*><A, B>(f: F<A -> B>, x: F<A>) -> F<B>

单子

如果一个类型构造体 F 定义了下面两个函数,它就是一个单子 (Monad):

func pure<A>(_ value: A) -> F<A>
func flatMap<A, B>(_ f: (A) -> F<B>) -> F<B>

Swift函数式编程十三(函子、适用函子、单子)相关推荐

  1. Swift の 函数式编程

    Swift 相比原先的 Objective-C 最重要的优点之一,就是对函数式编程提供了更好的支持. Swift 提供了更多的语法糖和一些新特性来增强函数式编程的能力,本文就在这方面进行一些讨论. S ...

  2. 简单介绍函数式编程中的Functor(函子),Applicative(加强版函子),Monad(单子)

    原文地址:http://skaka.me/blog/2015/12/19/functor-applicative-monad-scala-haskell/ 如果你是刚接触函数式编程,可能很容易被下面这 ...

  3. JS函数式编程概念理解:函子(Functor)

    标签(空格分隔): 函数式编程 函子 functor 很多前端在学习函数式编程之前,都会被各种概念折磨的死去活来,本文的重点算是函数式编程之前的一个甜品,重点在如何切入. 函子即Functor是FP( ...

  4. Swift函数式编程十一(解析器组合算子)

    代码地址 解析类似1+2*3这样的数学表达式. 解析器类型 通常一个解析器会接受一个字符串,解析成功返回一些值和剩下的字符串,解析失败则什么也不返回.这个过程总结为这样一个函数类型: typealia ...

  5. Swift函数式编程十二(表格应用)

    代码地址 这个示例为希望被解析的表达式编写解析器,并为这些表达式编写一个求值器,然后将其嵌入界面中. 解析 基于解析器组合算子中的算术表达式解析器,引入额外的抽象层级. 之前,编写的解析器会直接返回计 ...

  6. 函数式编程 -- 函子(Functor)

    文章内容输出来源:拉勾教育 大前端高薪训练营 前言 我在另一篇文章 函数式编程 – 纯函数.柯里化函数 中写到,副作用会让一些函数变得不纯,那么,我们如何把副作用控制在可控的范围内呢,这就涉及到了函子 ...

  7. JavaScript函数式编程之函子

    函子(Functor) 函子是一个特殊的容器,通过一个普通对象来实现,该对象具有map方法,map方法可以运行一个函数对值进行处理(变形关系),容器包含值和值变形关系(这个变形关系就是函数).函数式编 ...

  8. 函数式编程的Java编码实践:利用惰性写出高性能且抽象的代码

    简介: 本文会以惰性加载为例一步步介绍函数式编程中各种概念,所以读者不需要任何函数式编程的基础,只需要对 Java 8 有些许了解即可. 作者 | 悬衡 来源 | 阿里技术公众号 本文会以惰性加载为例 ...

  9. JavaScript 函数式编程(三)

    slide 地址 四.Talk is cheap!Show me the ... MONEY! 以下内容主要参考自 Professor Frisby Introduces Composable Fun ...

  10. 编程范式 —— 函数式编程入门

    该系列会有 3 篇文章,分别介绍什么是函数式编程.剖析函数式编程库.以及函数式编程在 React 中的应用,欢迎关注我的 blog 命令式编程和声明式编程 拿泡茶这个事例进行区分命令式编程和声明式编程 ...

最新文章

  1. star不代表一切。React:嘿Vue和Angular!就问你们怕不怕!!
  2. ExpandableListView的使用以及信息的高亮显示
  3. Python慢,为啥还有大公司用?
  4. SpringBoot配置Druid
  5. 做倒计时一天_不知道这6个管理时间的工具,做不好时间管理
  6. 怎么把汇编语言变成c语言,如何把汇编语言转换成C语言
  7. LateX在windows中运用MiKTeX
  8. 修改代理_IP代理修改上网IP地址的作用
  9. xSeries 232双机热备份配置(塔式)
  10. Replication Backlog
  11. mesos 学习笔记-- mesos安装和配置
  12. excel制作录入和查询系统_Excel进销存管理系统,完整函数应用,出入查询库存更新自动显示...
  13. iOS UITextField设置起始字符开始位置
  14. 手机上编写Java程序的软件
  15. Qt实现提示音以及QSound的使用说明
  16. WebService系列之HttpClient调用WebService接口
  17. 基于微信小程序驾校报名系统(微信小程序毕业设计)
  18. 阿里云服务器如何购买?三种方式可买(图文教程举例)
  19. 关于微信小程序文字水平垂直居中
  20. layui表格里面加载照片

热门文章

  1. android 音频转mp3格式,音频 (六)- 安卓 ndk 将 pcm 转换为 mp3
  2. Caffe_stu03_小训练
  3. win11java环境配置
  4. java根据经纬度获取地址信息
  5. 链家深圳二手房房价数据分析
  6. [转]2009年河南省高考零分作文:兔子,你就是一个傻B
  7. 解决java.lang.ClassCastException class java.lang.Integer cannot be cast to class java.lang.Long异常
  8. vb msgbox各种图标样式及按钮样式
  9. dell计算机的硬盘如何分区,戴尔电脑分盘怎么分区
  10. 迅雷调用Potplayer边下边播