14

根据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 :: af :: a -> b

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

4

1 回答 1

17

是的。事实上,我们可以做出更强有力的声明,即所有函数都具有类型

fmap :: (a -> b) -> (F a -> F b)

这样fmap id = id是等价的。这实际上不属于fmap所谓的参数化类型。

>>=在你的情况下,如果return满足单子定律,那么

 mFmap f a  = a >>= return . f
 mFmap id a = a >>= return . id
 mFmap id a = a >>= return
 mFmap id a = a
 mFmap id = id

a >>= return根据正义的单子法则a。使用这个结果,我们可以诉诸从参数化中得到的自由定理,并且我们得到了证明。

于 2014-02-13T18:03:22.570 回答