选项既是函子又是单子?

fra*_*lin 1 monads scala functor

ScalaOption既是 monad 又是函子吗?

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

函子

  • 包装(或apply),它接受一个原语并将其包装在函子内

  • map它接受一个函子,解开它,应用一些函数并重新包装它

Option函子也是如此。因为我可以将 an 应用于Option给我的原始数据Option[T]。我还可以map获取Option函子内部的内容并在内部重新打包Option

单子有何不同?我本来以为单子也有函数applymap功能。从这篇文章中我了解到单子flatMap? 哪个被定义为简单map但没有将结果重新打包到 monad 中?(或者是map没有将结果重新打包到函子内?!)

既然Option提供了两者mapflatMap这是否意味着它既Option是函子又是单子?

Jör*_*tag 5

简短回答:是的。

更长的答案:每个单子都是一个应用函子,每个应用函子都是一个函子。用面向对象的术语来说:Monad <: Applicative <: Functor。