0

据我所知,函子是那些有的map(),而单子是那些也有的flatMap()。所有的 Monad 都是 Functor,但反之则不然。是什么阻止了 Functor 实现 aflatMap()并成为 Monad?由于某些限制,是否有任何函子保持这种状态。你能提供一些例子吗?谢谢。

4

2 回答 2

4

声明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 中的方法。这是做不到的,因为你可以用单子做你不能用函子做的事情。所以我们说并不是所有的函子都是单子。

于 2019-10-02T07:45:15.143 回答
1

如果一个类型实现flatMap()(以及return()/unit()/emit()/inject()/wrap()/...),根据定义,它已经是一个 Monad。

“函子”是给定类型的非常狭窄的视图。它只考虑它的能力map()。当将其视为“函子”的实例时,不考虑给定类型的任何细节。

如果给定类型可以实现(以及)守法 * ,那么它也可以被视为“Monad”的合法实例。flatMap()return()

如果不透明类型不提供给我们return(),它就不能被视为 Monad,这是一种可能性。

另一个是flatMap()不遵循单子定律的。

编辑:( *感谢@leftaroundabout指出法律。另一方面,在 Haskell 中声明一个非法的 Monad 实例在技术上仍然是可行的,尽管这肯定是不可取的。

于 2019-10-02T07:13:41.447 回答