{"rsdb":{"rid":"179823","subhead":"","postdate":"0","aid":"130442","fid":"90","uid":"1","topic":"1","content":"
\n

    Monad typeclass\u4e0d\u662f\u4e00\u79cd\u7c7b\u578b\uff0c\u800c\u662f\u4e00\u79cd\u7a0b\u5e8f\u8bbe\u8ba1\u6a21\u5f0f\uff08design pattern\uff09\uff0c\u662f\u6cdb\u51fd\u7f16\u7a0b\u4e2d\u6700\u91cd\u8981\u7684\u7f16\u7a0b\u6982\u5ff5\uff0c\u56e0\u800c\u5f88\u591a\u884c\u5185\u4eba\u628aFP\u53c8\u79f0\u4e3aMonadic Programming\u3002\u8fd9\u5176\u4e2d\u900f\u9732\u7684Monad\u91cd\u8981\u6027\u5219\u4e0d\u8a00\u800c\u55bb\u3002Scalaz\u662f\u901a\u8fc7Monad typeclass\u4e3a\u6570\u636e\u8fd0\u7b97\u7684\u7a0b\u5e8f\u63d0\u4f9b\u4e86\u4e00\u5957\u89c4\u8303\u7684\u7f16\u7a0b\u65b9\u5f0f\uff0c\u5982\u5e38\u89c1\u7684for-comprehension\u3002\u800c\u4e0d\u540c\u7c7b\u578b\u7684Monad\u5b9e\u4f8b\u5219\u4f1a\u652f\u6301\u4e0d\u540c\u7684\u7a0b\u5e8f\u8fd0\u7b97\u884c\u4e3a\uff0c\u5982\uff1aOption Monad\u5728\u8fd0\u7b97\u4e2d\u5982\u679c\u9047\u5230None\u503c\u5219\u4f1a\u4e2d\u9014\u9000\u51fa\uff1bState Monad\u4f1a\u786e\u4fdd\u72b6\u6001\u503c\u4f1a\u4f34\u968f\u7740\u7a0b\u5e8f\u8fd0\u884c\u6d41\u7a0b\u76f4\u5230\u7ec8\u7ed3\uff1bList Monad\u8fd0\u7b97\u53ef\u80fd\u4f1a\u4ea7\u751f\u591a\u4e2a\u7ed3\u679c\u7b49\u7b49\u3002Scalaz\u63d0\u4f9b\u4e86\u5f88\u591a\u4e0d\u540c\u79cd\u7c7b\u7684Monad\u5982\uff1aStateMonad, IOMonad, ReaderMonad, WriterMonad\uff0cMonadTransformer\u7b49\u7b49\uff0c\u8fd9\u4ece\u53e6\u4e00\u4e2a\u89d2\u5ea6\u4e5f\u91cd\u7533\u4e86Monad\u6982\u5ff5\u5728\u6cdb\u51fd\u7f16\u7a0b\u91cc\u7684\u91cd\u8981\u6027\u3002\u542c\u8d77\u6765\u4ee5\u4e0a\u8fd9\u4e9b\u63cf\u8ff0\u597d\u50cf\u6709\u70b9\u6478\u4e0d\u7740\u5934\u8111\uff0c\u53ef\u80fd\u5e94\u8be5\u628a\u5b83\u4eec\u653e\u5728\u672c\u7bc7\u6700\u7ec8\u603b\u7ed3\uff0c\u4e0d\u8fc7\u6211\u8fd8\u662f\u60f3\u8ba9\u5927\u5bb6\u6709\u4e2a\u5927\u7684\u6982\u5ff5\u3002\u5bf9\u4e0b\u9762\u7684\u8ba8\u8bba\u7ec6\u8282\u7684\u7406\u89e3\u80fd\u6709\u6240\u5e2e\u52a9\u3002\u6211\u4eec\u8fd8\u662f\u4eceMonad trait\u5f00\u59cb\u4ecb\u7ecd\u5427\uff1a<\/span><\/p> \n

\n
 1<\/span> trait Monad[F[_]] extends Applicative[F] with Bind[F] { self =>\r\n 2<\/span>   \/\/\/<\/span>\/ scalaz\/Monad.scala<\/span>\r\n 3<\/span> \r\n 4<\/span>   override<\/span> def map[A,B](fa: F[A])(f: A => B) = bind(fa)(a => point(f(a))) <\/span> 5<\/span> ... <\/span> 6<\/span> trait Applicative[F[_]] extends Apply[F] { self =>\r\n 7<\/span>   \/\/\/<\/span>\/ scalaz\/Applicative.scala<\/span>\r\n 8<\/span>   def point[A](a: => A): F[A] <\/span> 9<\/span> ... <\/span>10<\/span> trait Apply[F[_]] extends Functor[F] { self =>\r\n11<\/span>   \/\/\/<\/span>\/ scalaz\/Apply.scala<\/span>\r\n12<\/span>   def ap[A,B](fa: => F[A])(f: => F[A => B]): F[B] <\/span>13<\/span> ... <\/span>14<\/span> trait Bind[F[_]] extends Apply[F] { self =>\r\n15<\/span>   \/\/\/<\/span>\/ scalaz\/Bind.scala<\/span>\r\n16<\/span> \r\n17<\/span>   \/*<\/span>* Equivalent to `join(map(fa)(f))`. <\/span>*\/<\/span>\r\n18<\/span>   def bind[A, B](fa: F[A])(f: A => F[B]): F[B] <\/span>19<\/span> \r\n20<\/span>   override<\/span> def ap[A, B](fa: => F[A])(f: => F[A => B]): F[B] = { <\/span>21<\/span>     lazy val fa0 = fa <\/span>22<\/span>  bind(f)(map(fa0)) <\/span>23<\/span>  } <\/span>24<\/span> ...<\/span><\/pre> \n <\/div> \n 

\u4e0a\u9762\u8fd9\u4e9b\u7c7b\u578btrait\u7684\u7ee7\u627f\u5173\u7cfb\u662f\u8fd9\u6837\u7684\uff1aMonad\u7ee7\u627f\u4e86Applicative\u548cBind\uff0cApplicative\u7ee7\u627f\u4e86Apply, Apply\u7ee7\u627f\u4e86Functor, Bind\u4e5f\u7ee7\u627f\u4e86Apply\u3002\u6240\u4ee5Monad\u540c\u65f6\u53c8\u662fApplicative\u548cFunctor\uff0c\u56e0\u4e3aMonad\u5b9e\u73b0\u4e86map\u548cap\u51fd\u6570\u3002\u4e00\u4e2aMonad\u5b9e\u4f8b\u53ef\u4ee5\u8c03\u7528\u6240\u6709Applicative\u548cFunctor\u63d0\u4f9b\u7684\u7ec4\u4ef6\u51fd\u6570\u3002\u4efb\u4f55\u5b9e\u4f8b\u53ea\u9700\u8981\u5b9e\u73b0\u62bd\u8c61\u51fd\u6570point\u548cbind\u5c31\u53ef\u4ee5\u6210\u4e3aMonad\u5b9e\u4f8b\uff0c\u7136\u540e\u5c31\u53ef\u4ee5\u4f7f\u7528Monad\u6240\u6709\u7684\u7ec4\u4ef6\u51fd\u6570\u4e86\u3002<\/span><\/p> \n

Monad\u6240\u63d0\u4f9b\u7684\u4e3b\u8981\u6ce8\u5165\u65b9\u6cd5\uff08injected method\uff09\u662f\u5728BindOps\u548cMonadOps\u91cc\u3002\u5728BindOps\u91cc\u4e3b\u8981\u63d0\u4f9b\u4e86flatMap: scalaz\/syntax\/BindSyntax.scala<\/span><\/p> \n

\n
 1<\/span> final class<\/span> BindOps[F[_],A] private<\/span>[syntax](val self: F[A])(implicit<\/span> val F: Bind[F]) extends Ops[F[A]] { <\/span> 2<\/span>   \/\/\/<\/span>\/<\/span>\r\n 3<\/span>   import Liskov.<~<, Leibniz.===\r\n 4<\/span> \r\n 5<\/span>   def flatMap[B](f: A => F[B]) = F.bind(self)(f) <\/span> 6<\/span> \r\n 7<\/span>   def >>=[B](f: A => F[B]) = F.bind(self)(f) <\/span> 8<\/span> \r\n 9<\/span>   def ?[B](f: A => F[B]) = F.bind(self)(f) <\/span>10<\/span> ...<\/span><\/pre> \n <\/div> \n 

\u4e3b\u8981\u662f\u8fd9\u4e2aflatMap\u51fd\u6570\uff0c\u5728scalaz\u91cc\u7528>>=\u6765\u8868\u793a\u3002\u8fd9\u662f\u4e00\u4e2a\u5927\u5bb6\u90fd\u8d77\u7801\u8033\u719f\u7684\u51fd\u6570\uff1a\u597d\u50cfflatMap\u5c31\u4ee3\u8868\u4e86Monad\u3002\u5728MonadOps\u91cc\u63d0\u4f9b\u7684\u6ce8\u5165\u65b9\u6cd5\u5982\u4e0b\uff1ascalaz\/Syntax\/MonadSyntax.scala<\/span><\/p> \n

\n
 1<\/span> final class<\/span> MonadOps[F[_],A] private<\/span>[syntax](val self: F[A])(implicit<\/span> val F: Monad[F]) extends Ops[F[A]] { <\/span> 2<\/span>   \/\/\/<\/span>\/<\/span>\r\n 3<\/span> \r\n 4<\/span>   def liftM[G[_[_], _]](implicit<\/span> G: MonadTrans[G]): G[F, A] = G.liftM(self) <\/span> 5<\/span> \r\n 6<\/span>   def whileM[G[_]](p: F[Boolean])(implicit<\/span> G: MonadPlus[G]): F[G[A]] = F.whileM(p, self) <\/span> 7<\/span> \r\n 8<\/span>   def whileM_(p: F[Boolean]): F[Unit] = F.whileM_(p, self) <\/span> 9<\/span> \r\n10<\/span>   def untilM[G[_]](p: => F[Boolean])(implicit<\/span> G: MonadPlus[G]): F[G[A]] = F.untilM(self, p) <\/span>11<\/span> \r\n12<\/span>   def untilM_(p: => F[Boolean]): F[Unit] = F.untilM_(self, p) <\/span>13<\/span> \r\n14<\/span>   def iterateWhile(p: A => Boolean): F[A] = F.iterateWhile(self)(p) <\/span>15<\/span> \r\n16<\/span>   def iterateUntil(p: A => Boolean): F[A] = F.iterateUntil(self)(p) <\/span>17<\/span> \r\n18<\/span>   \/\/\/<\/span>\/<\/span>\r\n19<\/span> }<\/span><\/pre> \n <\/div> \n 

\u770b\u8d77\u6765\u8fd9\u4e9b\u6ce8\u5165\u65b9\u6cd5\u90fd\u662f\u4e00\u4e9b\u7f16\u7a0b\u8bed\u8a00\u91cc\u7684\u6d41\u7a0b\u63a7\u5236\u8bed\u6cd5\uff08control flow syntax\uff09\u3002\u8fd9\u662f\u4e0d\u662f\u6697\u793a\u7740Monad\u6700\u7ec8\u4f1a\u5b9e\u73b0\u67d0\u79cd\u7f16\u7a0b\u8bed\u8a00\uff1f\u6211\u4eec\u628a\u8fd9\u4e9b\u51fd\u6570\u7684\u4f7f\u7528\u65b9\u6cd5\u653e\u5728\u540e\u9762\u7684\u4e00\u4e9b\u8ba8\u8bba\u53bb\u3002\u6211\u4eec\u5148\u6765\u5206\u6790\u4e00\u4e0bflatMap\u51fd\u6570\uff0c\u56e0\u4e3a\u8fd9\u662f\u4e2aMonad\u4ee3\u8868\u51fd\u6570\u3002\u4e0b\u9762\u662fFunctor,Applicative\u548cMonad\u65bd\u7528\u51fd\u6570\u683c\u5f0f\u6bd4\u8f83\uff1a<\/span><\/p> \n

\n
1<\/span> \/\/<\/span> Functor    :  map[A,B]    (F[A])(f:   A => B):  F[B]\r\n<\/span>2<\/span> \/\/<\/span> Applicative:  ap[A,B]     (F[A])(f: F[A => B]): F[B] \r\n<\/span>3<\/span> \/\/<\/span> Monad      :  flatMap[A,B](F[A])(f: A => F[B]): F[B]<\/span><\/pre> \n <\/div> \n 

\u4ee5\u4e0a\u4e09\u79cd\u51fd\u6570\u6b3e\u5f0f\u57fa\u672c\u4e0a\u662f\u4e00\u81f4\u7684\u3002\u5927\u5bb6\u90fd\u8bf4\u8fd9\u5c31\u662f\u4e09\u79cdFP\u7684\u51fd\u6570\u65bd\u7528\u65b9\u5f0f\uff1a\u5728\u4e00\u4e2a\u5bb9\u5668\u5185\u8fdb\u884c\u51fd\u6570\u7684\u8fd0\u7b97\u540e\u628a\u7ed3\u679c\u8fd8\u7559\u5728\u5bb9\u5668\u5185\u3001\u5f97\u5230\u7684\u6548\u679c\u662f\u8fd9\u6837\u7684\uff1aF[A] => F[B]\u3002\u53ea\u662f\u5b83\u4eec\u5206\u522b\u7528\u4e0d\u540c\u7684\u65b9\u5f0f\u63d0\u4f9b\u8fd9\u4e2a\u65bd\u7528\u7684\u51fd\u6570\u3002Functor\u7684map\u63d0\u4f9b\u4e86\u666e\u901a\u51fd\u6570\uff0cApplicative\u901a\u8fc7\u5bb9\u5668\u63d0\u4f9b\u4e86\u65bd\u7528\u51fd\u6570ap\u800cMonad\u5219","orderid":"0","title":"Scalaz\uff0810\uff09\uff0d Monad\uff1a\u5c31\u662f\u4e00\u79cd\u51fd\u6570\u5f0f\u7f16\u7a0b\u6a21\u5f0f\uff0da design pattern(\u4e00)","smalltitle":"","mid":"0","fname":"Scala","special_id":"0","bak_id":"0","info":"0","hits":"4670","pages":"3","comments":"0","posttime":"2017-10-10 12:13:36","list":"1507608816","username":"admin","author":"","copyfrom":"","copyfromurl":"","titlecolor":"","fonttype":"0","titleicon":"0","picurl":"https:\/\/www.cppentry.com\/upload_files\/","ispic":"0","yz":"1","yzer":"","yztime":"0","levels":"0","levelstime":"0","keywords":"Scalaz<\/A> Monad<\/A> \u5c31\u662f<\/A> \u51fd\u6570<\/A> \u7f16\u7a0b<\/A> \u6a21\u5f0f<\/A> design<\/A> pattern<\/A>","jumpurl":"","iframeurl":"","style":"","template":"a:3:{s:4:\"head\";s:0:\"\";s:4:\"foot\";s:0:\"\";s:8:\"bencandy\";s:0:\"\";}","target":"0","ip":"113.108.110.181","lastfid":"0","money":"0","buyuser":"","passwd":"","allowdown":"","allowview":"","editer":"","edittime":"0","begintime":"0","endtime":"0","description":"Scalaz\uff0810\uff09\uff0d Monad\uff1a\u5c31\u662f\u4e00\u79cd\u51fd\u6570\u5f0f\u7f16\u7a0b\u6a21\u5f0f\uff0da design pattern","lastview":"1713519397","digg_num":"1684","digg_time":"0","forbidcomment":"0","ifvote":"0","heart":"","htmlname":"","city_id":"0"},"page":"1"}