Tri*_*Lee 5 monads haskell functor
查阅Control.Monad文档后,我对这段话感到困惑:
上述法律意味着:
fmap f xs = xs >>= return . f
他们怎么暗示这个?
作为这些法律的结果,
Functorf 的实例将满足Run Code Online (Sandbox Code Playgroud)fmap f x = pure f <*> x
Applicative和之间的关系Monad说
Run Code Online (Sandbox Code Playgroud)pure = returnRun Code Online (Sandbox Code Playgroud)(<*>) = ap
ap 说
Run Code Online (Sandbox Code Playgroud)return f `ap` x1 `ap` ... `ap` xn相当于
Run Code Online (Sandbox Code Playgroud)liftMn f x1 x2 ... xn
因此
fmap f x = pure f <*> x
= return f `ap` x
= liftM f x
= do { v <- x; return (f v) }
= x >>= return . f
Run Code Online (Sandbox Code Playgroud)
Functor实例是唯一的,在某种意义上,如果F是a Functor并且你有一个函数foobar :: (a -> b) -> F a -> F b,那么foobar id = id(也就是说,它遵循第一个仿函数法则)foobar = fmap.现在,考虑这个功能:
liftM :: Monad f => (a -> b) -> f a -> f b
liftM f xs = xs >>= return . f
Run Code Online (Sandbox Code Playgroud)
那是什么liftM id xs?
liftM id xs
xs >>= return . id
-- id does nothing, so...
xs >>= return
-- By the second monad law...
xs
Run Code Online (Sandbox Code Playgroud)
liftM id xs = xs; 就是,liftM id = id.因此,liftM = fmap; 或者,换句话说......
fmap f xs = xs >>= return . f
Run Code Online (Sandbox Code Playgroud)
通过Applicative法律路线的epheriment的答案也是达成这个结论的有效方式.