Option 既是函子又是 monad?
Option is both a functor and a monad?
Scala 的 Option
是 monad 还是 functor?
据我了解,仿函数只是一种公开以下内容的数据类型API:
函子:
wrap(或apply
)接受一个原语并将其包装在仿函数中
map
接受一个函子,展开它,应用一些函数并重新包装它
所以Option
是一个函子。因为我可以将 Option
应用到原语上,从而得到 Option[T]
。我还可以在 Option
上 map
获取仿函数内部的内容并在 Option
.
中重新打包
monad 有何不同?我原以为 monad 也有一个 apply
函数和一个 map
函数。从 this article 我收集到一个 monad 也 有 flatMap
?哪个被简单地定义为 map
但没有将结果重新打包到 monad 中? (或者是 map
而不是在仿函数中重新打包结果?!)
因为 Option
提供 map
和 flatMap
这是否意味着 Option
既是函子又是 monad?
简答:是。
更长的答案:每个单子都是一个应用函子,每个应用函子都是一个函子。在 Object-Oriented 术语中:Monad <: Applicative <: Functor.
Scala 的 Option
是 monad 还是 functor?
据我了解,仿函数只是一种公开以下内容的数据类型API:
函子:
wrap(或
apply
)接受一个原语并将其包装在仿函数中map
接受一个函子,展开它,应用一些函数并重新包装它
所以Option
是一个函子。因为我可以将 Option
应用到原语上,从而得到 Option[T]
。我还可以在 Option
上 map
获取仿函数内部的内容并在 Option
.
monad 有何不同?我原以为 monad 也有一个 apply
函数和一个 map
函数。从 this article 我收集到一个 monad 也 有 flatMap
?哪个被简单地定义为 map
但没有将结果重新打包到 monad 中? (或者是 map
而不是在仿函数中重新打包结果?!)
因为 Option
提供 map
和 flatMap
这是否意味着 Option
既是函子又是 monad?
简答:是。
更长的答案:每个单子都是一个应用函子,每个应用函子都是一个函子。在 Object-Oriented 术语中:Monad <: Applicative <: Functor.