根据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
。
这是真的?这是否作为一个定理成立?