对于一个类型的不同可能的Monad实例,隐含的Functor实例总是相同的吗?

Raf*_*ini 14 monads haskell functor free-theorem

根据Typeclassopedia这个链接,一个类型只能有一个Functor实例(链接中有一个证据).但我的理解是,给定类型可能有多个可能的Monad实例,这是对的吗?但对于给定的Monad实例,有一个免费的Functor实例

fmap f xs  =  xs >>= return . f
Run Code Online (Sandbox Code Playgroud)

由此我得出结论,如果我偶然发现一个我可以用Monad不同方式定义多个实例的类型,那么fmap上面派生的函数必须对所有它们都相等,换句话说,如果我有两对函数:

bind_1 :: m a -> (a -> m b) -> m b
unit_1 :: a -> m a

bind_2 :: m a -> (a -> m b) -> m b
unit_2 :: a -> m a
Run Code Online (Sandbox Code Playgroud)

对于相同类型的构造函数m,必然:

xs `bind_1` (unit_1 . f) == xs `bind_2` (unit_2 . f)
Run Code Online (Sandbox Code Playgroud)

为了所有xs :: af :: a -> b.

这是真的?这是否作为一个定理?

Dan*_*zer 17

是.事实上,我们可以做出更强大的声明,即所有函数都与该类型有关

fmap :: (a -> b) -> (F a -> F b)
Run Code Online (Sandbox Code Playgroud)

fmap id = id是等同的.这实际上只是属于fmap称为参数化的类型.

在你的情况下,如果>>=return满足monad法则,那么

 mFmap f a  = a >>= return . f
 mFmap id a = a >>= return . id
 mFmap id a = a >>= return
 mFmap id a = a
 mFmap id = id
Run Code Online (Sandbox Code Playgroud)

由monad法则即a >>= returna.使用这个结果,我们可以诉诸我们从参数化得到的自由定理,我们有证明.