Scala的Option
是单子还是函子?
据我了解,函子只是一种数据类型,它公开以下API:
功能键:
wrap(或apply
),它接受一个原语并将其包装在函子中
map
,其中需要一个函子,将其解包,应用某些功能,然后将其重新包装
因此Option
是一个函子。因为我可以将Option
应用于给我Option[T]
的图元。我还可以在map
上Option
来获得仿函数中的内容,并在Option
中重新打包。
monad有何不同?我以为monad也具有apply
函数和map
函数。从this article中,我得知一个单子也有flatMap
吗?哪个被简单定义为map
但没有将结果重新包装在monad中? (或者是map
,而没有将结果重新包装在函子中!!)
由于Option
同时提供map
和flatMap
,这是否意味着Option
既是函子又是单子?
答案 0 :(得分:3)
简短的回答:是的。
更长的答案:每个单子是一个可应用的函子,每个可应用的函子都是一个函子。用面向对象的术语:Monad <:适用性<:Functor。