Trầ*_* Dự 1 monads functional-programming scala
我正在学习Scala中的函数式编程,我学习了术语monad.简而言之,monad是:
trait M[A] {
def flatMap[B](f: A => M[B]): M[B]
}
def unit[A](x: A): M[A]
Run Code Online (Sandbox Code Playgroud)
我知道monad只是一个基于上述2条规则的概念.我们能满足在现实世界中很多单子,例如List,Future....
我不知道的唯一一个问题是:为什么我们应该知道术语"monad"与理解List apis,Future apis或者任何apis ...比较理解monad帮助我们编写更好的代码或者可以设计更好的功能代码结构.
谢谢
因为Monad已经是类别理论中的一个已知术语.还有3个非常重要的Monad法律,Monad必须坚持这些法律.
从理论上讲,我们可以将Monads称为"FlatMappable"或"Bindable",但"Monad"这个名称已经是函数式编程社区中的既定术语,与Monad法则密切相关.
至于为什么你应该学会欣赏Monads而不是单独学习每个api,这都是关于知识的抽象和重用.通常,当我们看一个新概念时,我们会将它们与我们已经知道的概念进行比较.
如果您已经了解Future Monad,那么理解Task Monad会更容易.
值得一提的是for-comprehensions,Scala专门在Monads上工作.事实上for-comprehensions,只是语法糖flatMap和map(也有filter,但这与Monads并不是非常相关).因此,如果某些东西是Monad实例,则可以使用这一额外的句法糖.
一旦你完全掌握了抽象,你就可以利用像Monad变换器这样的概念,其中Monad的实际类型不那么重要.
最后,为了完整起见,这是Monad法则:
M[F].pure(x).flatMap(f) == f(x)m.flatMap(pure(_)) == mm.flatMap(f).flatMap(g) == m.flatMap(x => f(x).flatMap(g))| 归档时间: |
|
| 查看次数: |
277 次 |
| 最近记录: |