据我所知,函子是那些有的map()
,而单子是那些也有的flatMap()
。所有的 Monad 都是 Functor,但反之则不然。是什么阻止了 Functor 实现 aflatMap()
并成为 Monad?由于某些限制,是否有任何函子保持这种状态。你能提供一些例子吗?谢谢。
2 回答
声明all monads are functors意味着,仅使用 Monad 中的方法,我们可以实现 Functor 中的方法。这确实可以做到,这就是为什么我们说所有的单子都是函子。我不知道 Vavr,但这是 Haskell 中的一些代码:
{-# LANGUAGE FlexibleInstances, UndecidableInstances #-}
instance Monad m => Functor m where
fmap f x = x >>= (\x' -> return (f x'))
相比之下,所有函子都是 monad的声明意味着,仅使用 Functor 中的方法,我们就可以实现 Monad 中的方法。这是做不到的,因为你可以用单子做你不能用函子做的事情。所以我们说并不是所有的函子都是单子。
如果一个类型实现flatMap()
(以及return()/unit()/emit()/inject()/wrap()/...
),根据定义,它已经是一个 Monad。
“函子”是给定类型的非常狭窄的视图。它只考虑它的能力map()
。当将其视为“函子”的实例时,不考虑给定类型的任何细节。
如果给定类型可以实现(以及)守法( * ) ,那么它也可以被视为“Monad”的合法实例。flatMap()
return()
如果不透明类型不提供给我们return()
,它就不能被视为 Monad,这是一种可能性。
另一个是flatMap()
不遵循单子定律的。
编辑:( *)感谢@leftaroundabout指出法律。另一方面,在 Haskell 中声明一个非法的 Monad 实例在技术上仍然是可行的,尽管这肯定是不可取的。