根据Typeclassopedia和这个链接,一个类型只能有一个Functor实例(链接中有一个证明)。但我的理解是,给定类型可能有多个可能的Monad实例,对吗?但是对于给定的Monad实例,有一个免费的Functor实例
fmap f xs = xs >>= return . f
由此,我得出结论,如果我偶然发现了一种可以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
对于相同类型的构造函数m,比,必然:
xs `bind_1` (unit_1 . f) == xs `bind_2` (unit_2 . f)
对于所有xs :: a和f :: a -> b。
这是真的?这是否作为一个定理成立?