Functor(函子)、Monad(单子)、Applicative

一曲冷凌霜 提交于 2020-08-13 03:15:01

还是有点懵逼 ... 

函数式编程的主要思想是流程先行, 而非数据先行, 先指定流程, 然后输入数据, 所以操作的数据总是在参数的最后, 并非传统的面向数据的编程方式, 把数据放到前面进行后续操作

 

https://llh911001.gitbooks.io/mostly-adequate-guide-chinese/content/ch10.html#%E5%8D%8F%E8%B0%83%E4%BA%8E%E6%BF%80%E5%8A%B1

https://legacy.gitbook.com/book/llh911001/mostly-adequate-guide-chinese/details

圖解Functor,Applicative和Monad

https://zhuanlan.zhihu.com/p/28840109

https://github.com/fantasyland/fantasy-land

https://zhuanlan.zhihu.com/p/44046407

https://www.cnblogs.com/Abbey/p/11000520.html

https://blog.csdn.net/pingyan158/article/details/52764736

https://zhuanlan.zhihu.com/p/88741757

https://www.jianshu.com/p/001ff0dd3c30

https://llh911001.gitbooks.io/mostly-adequate-guide-chinese/content/

 

说的不错

在命名的时候,我们特别容易把自己限定在特定的数据上(本例中是 articles)。这种现象很常见,也是重复造轮子的一大原因。

+

 

 

纯函数是这样一种函数,即相同的输入,永远会得到相同的输出,而且没有任何可观察的副作用。

 

 

+

“作用”我们可以理解为一切除结果计算之外发生的事情。 

副作用是在计算结果的过程中,系统状态的一种变化,或者与外部世界进行的可观察的交互。

副作用可能包含,但不限于:

  • 更改文件系统
  • 往数据库插入记录
  • 发送一个 http 请求
  • 可变数据
  • 打印/log
  • 获取用户输入
  • DOM 查询
  • 访问系统状态
  •  

  纯函数总能够根据输入来做缓存

 

 

curry 的概念很简单:只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数。

当我们谈论纯函数的时候,我们说它们接受一个输入返回一个输出。curry 函数所做的正是这样:每传递一个参数调用函数,就返回一个新函数处理剩余的参数。这就是一个输入对应一个输出啊。

+

 

哪怕输出是另一个函数,它也是纯函数。当然 curry 函数也允许一次传递多个参数,但这只是出于减少 () 的方便。

 

+

这就是 组合(compose,以下将称之为组合):

组合的结合律

var associative = compose(f, compose(g, h)) == compose(compose(f, g), h);

两个组合的函数, 接受的参数应该在输入和输出关系上一致, 即前者的出口类型对应后者的入口类型

var compose = function(f,g) {
  return function(x) {
    return f(g(x));
  };
};

f  g 都是函数,x 是在它们之间通过“管道”传输的值。

 利用组合率优化代码

var law = compose(map(f), map(g)) == map(compose(f, g));
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!