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

    \u524d\u9762\u63d0\u5230\u4e86scalaz\u662f\u4e2a\u51fd\u6570\u5f0f\u7f16\u7a0b\uff08FP\uff09\u5de5\u5177\u5e93\u3002\u5b83\u63d0\u4f9b\u4e86\u8bb8\u591a\u65b0\u7684\u6570\u636e\u7c7b\u578b\u3001\u62d3\u5c55\u7684\u6807\u51c6\u7c7b\u578b\u53ca\u5b8c\u6574\u7684\u4e00\u5957typeclass\u6765\u652f\u6301scala\u8bed\u8a00\u7684\u51fd\u6570\u5f0f\u7f16\u7a0b\u6a21\u5f0f\u3002\u6211\u4eec\u77e5\u9053\uff1a\u5bf9\u4e8e\u4efb\u4f55\u7c7b\u578b\uff0c\u6211\u4eec\u53ea\u9700\u8981\u5b9e\u73b0\u8fd9\u4e2a\u7c7b\u578b\u7684typeclass\u5b9e\u4f8b\u5c31\u53ef\u4ee5\u5728\u5bf9\u8fd9\u4e2a\u7c7b\u578b\u65bd\u7528\u6240\u5bf9\u5e94typeclass\u63d0\u4f9b\u7684\u6240\u6709\u7ec4\u4ef6\u51fd\u6570\u4e86\uff08combinator\uff09\u3002\u7a81\u7136\u4e4b\u95f4\u6211\u4eec\u7684\u7126\u70b9\u597d\u50cf\u90fd\u653e\u5728\u4e86\u5982\u4f55\u83b7\u53d6typeclass\u5b9e\u4f8b\u4e0a\u4e86\uff0c\u4ece\u800c\u5ffd\u7565\u4e86\u8003\u8651\u4e3a\u4ec0\u4e48\u8981\u4f7f\u7528\u8fd9\u4e9btypeclass\u53ca\u4f7f\u7528\u4ec0\u4e48\u6837\u7684typeclass\u8fd9\u4e9b\u95ee\u9898\u4e86\u3002\u6240\u4ee5\u53ef\u80fd\u6709\u4eba\u4f1a\u95ee\u6211\uff1a\u5982\u4f55\u83b7\u53d6Int\u7684Monad\u5b9e\u4f8b\u3002\u6211\u4f1a\u53cd\u95ee\uff1a\u50bbB\uff0c\u4f60\u75af\u4e86\u5417\uff08are you insane\uff09\uff1f\u4f60\u5230\u5e95\u60f3\u5e72\u4ec0\u4e48\uff1f\u8fd9\u65f6\u50bbB\u53ef\u80fd\u5ffd\u7136\u4f1a\u9192\u609f\u8fd8\u6ca1\u771f\u6b63\u4e86\u89e3\u81ea\u5df1\u8fd9\u6837\u95ee\u7684\u76ee\u7684\u3002\u770b\u6765\u6211\u4eec\u8fd8\u662f\u56de\u5230\u95ee\u9898\u7684\u6e90\u5934\uff0c\u4ece\u4f7f\u7528scalaz\u7684\u57fa\u672c\u76ee\u7684\u5f00\u59cb\u8003\u8651\u5206\u6790\u4e86\u3002<\/span><\/p> \n

    \u6211\u4eec\u5c31\u56f4\u7ed5scalaz\u63d0\u4f9b\u7684\u6211\u4eec\u90fd\u719f\u6089\u7684typeclass Functor, Applicative, Monad\u6765\u5206\u6790\u8bf4\u660e\u5427\uff0c\u56e0\u4e3a\u6211\u4eec\u5728\u524d\u9762\u5bf9\u5b83\u4eec\u90fd\u8fdb\u884c\u4e86\u8ba8\u8bba\u4ecb\u7ecd\uff0c\u4e3a\u4e86\u4e0escalaz\u63d0\u4f9b\u7684\u4f17\u591a\u5176\u5b83typeclass\u6709\u6240\u533a\u5206\uff0c\u6211\u4eec\u5c31\u6682\u65f6\u628a\u5b83\u4eec\u7edf\u79f0\u4e3aMonadic typeclass\u5427\u3002\u9996\u5148\uff0c\u8fd9\u51e0\u4e2aMonadic typeclass\u4e0d\u662f\u6570\u636e\u7c7b\u578b\uff0c\u800c\u662f\u4ee3\u8868\u7740\u67d0\u4e9b\u7f16\u7a0b\u7684\u6a21\u5f0f\u3002\u6211\u4eec\u77e5\u9053FP\u7f16\u7a0b\u548cOOP\u7f16\u7a0b\u6700\u5927\u7684\u533a\u522b\u5c31\u662fFP\u7f16\u7a0b\u7684\u72b6\u6001\u4e0d\u53ef\u53d8\u6027\uff08immutability\uff09\u3001\u65e0\u526f\u4f5c\u7528\uff08no-side-effect\uff09\u3001\u7eaf\u51fd\u6570\u7ec4\u5408\u80fd\u529b\uff08pure code composability\uff09,\u8fd9\u5c31\u8981\u6c42FP\u7f16\u7a0b\u5728\u67d0\u79cd\u58f3\u5b50\uff08context\uff09\u91cc\u8fdb\u884c\u72b6\u6001\u8f6c\u53d8\uff08transformation\uff09\u3002\u5f62\u8c61\u70b9\u8868\u8fbe\u5c31\u662fF[T]\u3002F[]\u5c31\u662f\u5404\u79cd\u72ec\u7279\u7684\u58f3\u5b50\uff08context\uff09\u800cT\u5c31\u662f\u9700\u8981\u8fd0\u7b97\u8f6c\u53d8?\u7684\u67d0\u79cd\u7c7b\u578b\u503c\u3002FP\u7a0b\u5e8f\u7684\u7ed3\u679c\u5f62\u8c61\u63cf\u8ff0\u5c31\u597d\u50cfF[T] => F[U]\uff1a \u4ee3\u8868\u5728F[]\u58f3\u5b50\u5185\u5bf9T\u8fdb\u884c\u8fd0\u7b97\uff0c\u5e76\u628a\u7ed3\u679cU\u4fdd\u5b58\u5728F[]\u5185\u3002\u65e2\u7136FP\u7f16\u7a0b\u76f8\u5bf9\u4e8eOOP\u7f16\u7a0b\u662f\u79cd\u5168\u65b0\u7684\u7f16\u7a0b\u65b9\u5f0f\uff0c\u90a3\u4e48\u81ea\u7136\u9700\u8981\u4e00\u5957\u65b0\u7684\u7a0b\u5e8f\u72b6\u6001\u8f6c\u53d8\u65b9\u6cd5\uff0c\u4e5f\u5c31\u662f\u4e00\u5957\u65b0\u7684\u64cd\u4f5c\u51fd\u6570\u65bd\u7528\u6a21\u5f0f\u4e86\u3002Scalaz\u901a\u8fc7Functor, Applicative, Monad\u63d0\u4f9b\u4e86\u4e09\u79cd\u57fa\u672c\u7684\u51fd\u6570\u65bd\u7528\u65b9\u5f0f\uff0c\u5b83\u4eec\u90fd\u662f\u9488\u5bf9F[T]\u91cc\u7684T\u503c\uff1a<\/span><\/p> \n

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

\u4ee5\u4e0a\u51fd\u6570\u65bd\u7528\u65b9\u5f0f\u4ea7\u751f\u540c\u6837\u7684\u6548\u679c\uff1aF[T] => F[U]\uff0c\u90fd\u662f\u5178\u578b\u7684FP\u7f16\u7a0b\u65b9\u5f0f\u3002\u6240\u4ee5\u53ef\u4ee5\u8bf4Monadic typeclass\u63d0\u4f9b\u4e86\u89c4\u8303\u7684FP\u7f16\u7a0b\u6846\u67b6\uff08template\uff09,\u7a0b\u5e8f\u5458\u53ef\u4ee5\u4f7f\u7528\u8fd9\u4e9b\u6846\u67b6\u8fdb\u884cFP\u7f16\u7a0b\u3002\u5982\u679c\u8fd9\u6837\u89e3\u91ca\u4f7f\u7528scalaz\u7684\u76ee\u7684\uff0c\u662f\u4e0d\u662f\u66f4\u6e05\u695a\u4e00\u70b9\u4e86\uff1f<\/span><\/p> \n

\u4ece\u53e6\u4e00\u4e2a\u89d2\u5ea6\u89e3\u91ca\uff1ascalaz typeclass \u4ee3\u8868\u7740\u62bd\u8c61\u7f16\u7a0b\u6982\u5ff5\u3002typeclass\u662f\u901a\u8fc7\u5373\u5174\u591a\u6001\u6765\u5b9e\u73b0\u9488\u5bf9\u5404\u79cd\u7c7b\u578b\u503c\u7684FP\u5f0f\u8ba1\u7b97\u7684\u3002\u56de\u5230\u5f00\u5934\u50bbB\u7684\u95ee\u9898\uff1aInt\u662f\u4e00\u79cd\u57fa\u7840\u7c7b\u578b\uff0c\u6362\u53e5\u8bdd\u8bf4\u5c31\u662fFP\u51fd\u6570\u65bd\u7528\u7684\u76ee\u6807\u3002Monadic typeclass\u9488\u5bf9\u7684\u7c7b\u578b\u662f\u9ad8\u9636\u7684F[T]\u7c7b\u578b\u3002\u6211\u4eec\u9700\u8981\u5bf9\u5728F[]\u7684\u4f5c\u7528\u73af\u5883\u91ccT\u7c7b\u578b\u503c\u8ba1\u7b97\u65b9\u5f0f\u8fdb\u884c\u6982\u62ec\u3002\u6211\u4eec\u771f\u6b63\u9700\u8981\u83b7\u53d6\u7684\u5b9e\u4f8b\u5b9e\u9645\u4e0a\u662f\u9488\u5bf9\u9ad8\u9636\u7c7b\u578bF[_]\u7684\u3002\u6240\u4ee5\u50bbB\u95ee\u4e86\u4e2a\u9519\u8bef\u7684\u95ee\u9898\uff0c\u80af\u5b9a\u5979\u5f53\u65f6\u4e0d\u77e5\u81ea\u5df1\u5728\u5e72\u4ec0\u4e48\u3002<\/span><\/p> \n

\u73b0\u5728\u6211\u4eec\u53ef\u4ee5\u5206\u6790\u4e00\u4e0b\u5e94\u8be5\u4f7f\u7528\u4ec0\u4e48typeclass\u4e86\u3002\u603b\u4f53\u6765\u8bf4\uff0c\u6211\u7684\u7406\u89e3\u662f\u53ef\u4ee5\u628ascalaz typeclass\u5206\u6210\u79cd\u7c7b\u548c\u7279\u8d28\uff1a<\/span><\/p> \n

\u79cd\u7c7b\u5b9a\u4e49\u4e86FP\u7f16\u7a0b\u7684\u5404\u79cd\u6a21\u5f0f\u3002\u6bd4\u5982Functor, Applicative, Monad\u90fd\u4ee3\u8868\u4e0d\u540c\u7684\u7f16\u7a0b\u65b9\u5f0f\u6216\u8005\u8bf4\u5b83\u4eec\u90fd\u5177\u5907\u4e0d\u540c\u7684\u7a0b\u5e8f\u8fd0\u7b97\u6a21\u5f0f\u3002\u7279\u8d28\u662f\u6307\u4e0d\u540c\u7684\u6570\u636e\u7c7b\u578b\u6240\u5b9a\u4e49\u7684typeclass\u5b9e\u4f8b\u63a7\u5236\u7740\u7a0b\u5e8f\u7684\u5177\u4f53\u8fd0\u7b97\u884c\u4e3a\u3002\u5982Option Monad\u53ef\u4ee5None\u72b6\u6001\u4e2d\u9014\u7ec8\u6b62\u8fd0\u7b97\u3001State Monad\u786e\u4fdd\u72b6\u6001\u503c\u4e00\u76f4\u968f\u7740\u7a0b\u5e8f\u8fd0\u7b97\u3002\u5b83\u4eec\u90fd\u56e0\u4e3a\u57fa\u4e8e\u4e0d\u540c\u7c7b\u578b\u7684\u5b9e\u4f8b\u800c\u8868\u73b0\u4e0d\u540c\u7684\u8fd0\u7b97\u884c\u4e3a\u3002Functor, Applicative, Monad\u7684\u7279\u8d28\u5219\u7531\u5b83\u4eec\u7684\u5b9e\u4f8b\u4e2dmap, ap, flatMap\u8fd9\u4e09\u4e2a\u9a71\u52a8\u51fd\u6570\u7684\u5177\u4f53\u5b9e\u73b0\u65b9\u5f0f\u6240\u51b3\u5b9a\u3002\u6211\u4eec\u5148\u770b\u770b\u73b0\u6210\u7684Option Functor\uff0c\u5b83\u7684\u5b9e\u73b0\u65b9\u5f0f\u5982\u4e0b\uff1a<\/span><\/p> \n

\n
1<\/span> mplicit object<\/span> optionFunctor extends Functor[Option] { <\/span>2<\/span>     def map[T,U](ot: Option[T])(f: T => U): Option[U] = ot match { <\/span>3<\/span>         case<\/span> Some(t) => Some(f(t)) <\/span>4<\/span>         case<\/span> None => None <\/span>5<\/span>  } <\/span>6<\/span> }<\/span><\/pre> \n <\/div> \n 

Option Functor\u5b9e\u4f8b\u9a71\u52a8\u51fd\u6570map\u7684\u610f\u601d\u662f\u8bf4\u5982\u679c\u76ee\u6807\u7c7b\u578bF[T]\u7684\u503c\u662f\u4e2aSome\uff0c\u90a3\u4e48\u6211\u4eec\u5c31\u5728Some\u58f3\u5185\u65bd\u7528\u53c2\u6570\u63d0\u4f9b\u7684\u4e00\u822c\u51fd\u6570f\uff1b\u5982\u679c\u76ee\u6807\u503c\u662fNone\u5c31\u4e0d\u65bd\u7528\u51fd\u6570\u3002\u6211\u4eec\u518d\u770b\u770bList Functor\uff1a<\/span><\/p> \n

\n
1<\/span> implicit<\/span> object<\/span> listFunctor extends Functor[List] { <\/span>2<\/span>     def map[T,U](lt: List[T])(f: T => U): List[U] = lt match { <\/span>3<\/span>         case<\/span> Nil => Nil <\/span>4<\/span>         case<\/span> head :: tail => f(head) :: map(tail)(f) <\/span>5<\/span>  } <\/span>6<\/span> }<\/span><\/pre> \n <\/div> \n 

List Functor\u7684map\u51fd\u6570\u5f70\u663e\u51fa\u5bf9\u4e00\u4e32\u5728\u58f3\u5185\u5143\u7d20\u9010\u4e2a\u8f6c\u53d8\u7684\u7279\u6027\u3002\u4eceList\u64cd\u4f5c\u65b9\u5f0f\u5c31\u5f88\u5bb9\u6613\u7406\u89e3\uff1alist.map(t => transform(t))<\/span><\/p> \n

\u6211\u4eec\u518d\u770b\u770bOption Applicative\u7684\u5b9e\u4f8b\uff1a<\/span><\/p> \n

\n
1<\/span> implicit<\/span> object<\/span> objectApplicative extends Applicative[Option] { <\/span>2<\/span>     def point[T](t: T): Option[T] = Some(t) <\/span>3<\/span>     def ap[T,U](ot: Option[T])(of: Option[T => U]): Option[U] = (ot, of) match { <\/span>4<\/span>         case<\/span> (Some(t), Some(f)) => Some(f(t)) <\/span>5<\/span>         case<\/span> _ => None <\/span>6<\/span>  } <\/span>7<\/span> }<\/span><\/pre> \n <\/div> \n 

Option Applicative\u7684\u9a71\u52a8\u51fd\u6570ap\u53c8\u4e00\u6b21\u51f8\u663e\u4e86Option\u7684\u7279\u522b\u5904\u7406\u65b9\u5f0f\uff1a\u53ea\u6709\u5728\u76ee\u6807\u503c\u548c\u64cd\u4f5c\u51fd\u6570\u90fd\u4e0d\u4e3aNone\u65f6\u624d\u65bd\u7528\u901a\u8fc7\u58f3\u63d0\u4f9b\u7684\u64cd\u4f5c\u51fd\u6570\u3002<\/span><\/p> \n

\u518d\u770b\u770bOption Monad\u5b9e\u4f8b\uff1a<\/span><\/p> \n

\n
1<\/span> mplicit object<\/span> optionMonad extends Monad[Option] { <\/span>2<\/span>     def flatMap[T,U](ot: Option[T])(f: T => Option[U]): Option[U] = ot match { <\/span>3<\/span>         case<\/span> Some(t) => f(t) <\/span>4<\/span>         case<\/span> _ => None <\/span>5<\/span>  } <\/span>6<\/span> }<\/span><\/pre> \n <\/div> \n 

\u8fd9\u4e2aflatMap\u51fd\u6570\u53ef\u4ee5\u544a\u8bc9\u6211\u4eec\u66f4\u591a\u4e1c\u897f\uff1a\u5982\u679c\u6211\u4eec\u628aOption[T]\u89c6\u4f5c\u4e00\u4e2a\u8fd0\u7b97\u7684\u8bdd\uff0c\u90a3\u4e48\u53ea\u8981\u8fd9\u4e2a\u8fd0\u7b97\u7ed3\u679c\u4e0d\u4e3aNone\u5c31\u53ef\u4ee5\u9009\u62e9\u8fde\u7eed\u8fd0\u7b97\uff0c\u56e0\u4e3a\uff1af: T => Option[U]\uff0c\u7528\u6587\u5b57\u63cf\u8ff0\u5373\u4e3a\u7ed9\u4e00\u4e2aT\u503c\u8fdb\u884c\u8ba1\u7b97\u540e\u4ea7\u751f\u53e6\u4e00\u4e2a\u8fd0\u7b97Option[U]\uff0c\u5982\u679c\u518d\u7ed9Option[U]\u4e00\u4e2a\u503c\u8fdb\u884c\u8ba1\u7b97\u7684\u8bdd\u5c31\u53c8\u4f1a\u4ea7\u751f\u53e6\u4e00\u4e2a\u8fd0\u7b97Opton[V]... \u5982\u6b64\u6301\u7eed\uff1a<\/span><\/p> \n

F[A](a => F[B](b => F[C](c =","orderid":"0","title":"Scalaz\uff0811\uff09\uff0d Monad\uff1a\u4f60\u5b58\u5728\u7684\u610f\u4e49(\u4e00)","smalltitle":"","mid":"0","fname":"Scala","special_id":"0","bak_id":"0","info":"0","hits":"8098","pages":"4","comments":"0","posttime":"2017-10-10 12:13:35","list":"1507608815","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> \u5b58\u5728<\/A> \u610f\u4e49<\/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\uff0811\uff09\uff0d Monad\uff1a\u4f60\u5b58\u5728\u7684\u610f\u4e49","lastview":"1713960222","digg_num":"9876","digg_time":"0","forbidcomment":"0","ifvote":"0","heart":"","htmlname":"","city_id":"0"},"page":"1"}