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 :: a
和f :: 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 >>= return
是a
.使用这个结果,我们可以诉诸我们从参数化得到的自由定理,我们有证明.