Skip to content

changzhiwin/fp-things

Repository files navigation

Scala Hard Part

记录一些在实践Scala过程中,难以理解的点。大部分可能和FP相关,但也不全是。

如果把OOP比作是,那么FP说成是一点不夸张。这里有两层意思:

  • 它太性感了,会让部分人着
  • 具备一些魔法,很多源自category theory

type constructor

这个是一个语法概念,我们常理解的构造函数都是构造出常规实例的,例如val person = Person("Bob", 33);不曾想类型本身也可以构造,在写库或者读一些开源库的时候遇到这个问题的概率比较大。

详细理解,参见

type class

type system constructs that support ad hoc polymorphism -- wiki

在特定类型上表现出来的多态,实现的原理是trait定义接口 + implicit实现接口;也可以理解为在特定类型上实现的一组功能。

详细理解,参见

Monad

在容器之上抽象,这里M[_]就是一个容器。具备两个能力,就属于Monad:

  • pure, 把基础类型放入容器,也可以理解为包裹起来
  • flatMap,把包裹M[A]转换成M[B],本质是封装一个操作序列:提取 -> 转换 -> 再包裹
  • map,这个可以用上面两个操作实现

详细理解,参见

Functor

这可能是最容易理解的一个,毕竟map太常用了

  • map,只需要支持这个操作就可以

详细实践,参见

Free Monad

这个抽象在Monad之上,它能解决软件设计中逻辑和执行的分离,不好理解?建议了解一下ZIO

  • 对测试过程极度友好,因为执行环境可以随意切换
  • ATD, algebra data type

详细实践,参见DatabaseOps

Tagless Final

这个概念挺有争议的,也比较火;只能记录一点浅薄的理解,参见

执行

> sbt

sbt:fp-things> runMain fp.things.app.MonadApp

sbt:fp-things> runMain fp.things.app.FreeApp

引用

Releases

No releases published

Packages

No packages published

Languages