Option 既是函子又是 monad?

Option is both a functor and a monad?

Scala 的 Option 是 monad 还是 functor?

据我了解,仿函数只是一种公开以下内容的数据类型API:

函子:

所以Option是一个函子。因为我可以将 Option 应用到原语上,从而得到 Option[T]。我还可以在 Optionmap 获取仿函数内部的内容并在 Option.

中重新打包

monad 有何不同?我原以为 monad 也有一个 apply 函数和一个 map 函数。从 this article 我收集到一个 monad flatMap?哪个被简单地定义为 map 但没有将结果重新打包到 monad 中? (或者是 map 而不是在仿函数中重新打包结果?!)

因为 Option 提供 mapflatMap 这是否意味着 Option 既是函子又是 monad?

简答:是。

更长的答案:每个单子都是一个应用函子,每个应用函子都是一个函子。在 Object-Oriented 术语中:Monad <: Applicative <: Functor.