ãããªã¢ãŒãã£ãºã ããšããèšèã¯ãããªã¢ãŒãã£ãºã ãæ±ã®1ã€ã§ãããªããžã§ã¯ãæåããã°ã©ãã³ã°ãããã«æãåºããŸãïŒ åå¿è
åãã®ããªã¢ãŒãã£ãºã ïŒã ïŒãããŠãæããã«ãä»ã®æ±ãããéèŠã§ããïŒåæ§ã®å¹æãå¥ã®æ¹æ³ã§éæããããšãå¯èœã§ããããšãå€æããŸããã ããšãã°ãåã¯ã©ã¹ã䜿çšãããšãç¥å
ãå€æŽã§ããªãæ¢åã®åã«æ°ããæ©èœãå²ãåœãŠãããšãã§ããŸãããŸãã¯ãäºææ§ã®ãªãã¯ã©ã¹ãæã€ããŒã¿åã䜿çšããŠãå€éç¶æ¿ã®åé¡ãã解決ãã§ããŸãã
Habréã«ã¯ãåã¯ã©ã¹ã®æŠå¿µãæäŸããåºçç©ããã§ã«ããã€ããããŸãã
- @IvanGolovachéçºâ ãScalaã®FPïŒãã¡ã³ã¯ã¿ãŒãšã¯ïŒã -2015幎ã
ããã§ã¯ããã¡ã³ã¯ã¿ãŒãæ€èšããéã«åã¯ã©ã¹ãæ€èšããŸãã 説æã§ã¯ãåã¯ã©ã¹ã®äŸãããã€ã瀺ããŸãã - ããã€ã«ã»ãã¿ãã³@potanéçºâ ãC ++ã®åã¯ã©ã¹ã -2013 ã
ãã®åºçç©ã¯ãC ++ã§åã¯ã©ã¹ãå®è£
ããŠããŸãã ã©ããããèªè
ã¯ãã§ã«åã¯ã©ã¹ã«ããçšåºŠç²ŸéããŠãããšæ³å®ãããŠãããããåã¯ã©ã¹èªäœã«ã€ããŠã¯ããŸãèšåãããŠããŸããã - @VoidExéçºâ ãåã®ã¯ã©ã¹ãã¢ããã -2009 ã
Haskellåã¯ã©ã¹ã«ã€ããŠèª¬æããŸãïŒC ++ã®å®è£
äŸã䜿çšïŒã - @IvanPéçºâ ãHaskellã®å€æ
æ§ãšã¯ã©ã¹ã -2013 ã
ãã©ã¡ããªãã¯ããã³ã¢ãããã¯ããªã¢ãŒãã£ãºã ãã¿ã€ãã¯ã©ã¹ãããã³ããã€ãã®æšæºã¯ã©ã¹ã«ã€ããŠèª¬æããŸãã ãã¹ãŠã®èª¬æã¯Haskellèšèªçšã§ãã - æŽæ°ïŒ @vuspenskiyéçº-> Scalaã®åã¯ã©ã¹ -2012 ã
æé»çã«åã¯ã©ã¹ã䜿çšããæ¹æ³ã¯ã Comparator[T]
äŸã䜿çšããŠç°¡åã«èª¬æããŸãã
ãã®æçš¿ã§ã¯ãããã°ã©ãã®æ¥åžžçãªããŒã«ã®1ã€ãšããŠåã¯ã©ã¹ã®ãã¥ãŒãåæ ããããšæããŸãã ããã«ãHaskellã§ããããªãã§ã¯äœãã§ããªãå ŽåãSalaã§ã¯æ¬¡ã®ããšãã§ããŸãã ããã 圌ãã®ååšãç¥ããã«çããããšã¯å®¹èªã§ããŸãã ãã ãã詳ãã調ã¹ããšããã®ãããªããŒã«ã¯åå©çšå¯èœãªããã°ã©ã ãäœæãããšãã«éåžžã«äŸ¿å©ã§ããããšãããããŸãã ããã«ããã®ããŒã«ã«åºã¥ãããŠãããŒãµã«ã©ã€ãã©ãªãå€æ°ããããããã䜿çšããã«ã¯ãåã¯ã©ã¹ãç解ããå¿
èŠããããŸãã
äžå€ã®ããŒã¿å
é¢æ°åããã°ã©ãã³ã°ã§ã¯ãäžå€ã®ããŒã¿åãåºãæ®åããŠããŸãã ããŒã¿ãåæã«å€æŽããããšã¯ã§ããªããããããŒã¿ãé衚瀺ã«ããçç±ã¯ãªããããŒã¿ãé衚瀺ã«ãã代ããã«ãããŒã¿ããããªãã¯ã§ãããªãŒãã³åã䜿çšãããããã«ãªããŸããã ïŒãããã£ãŠãOOPã®3ã€ã®æ±-ããªã¢ãŒãã£ãºã ãç¶æ¿ãã«ãã»ã«å-ã®ãã¡ã®1ã€ã¯ãããåŽã«æŒãããããŠããŸããïŒ
èªç±ã«å©çšå¯èœãªããŒã¿ã«ãããå€éšåŠçã¢ã«ãŽãªãºã ã䜿çšã§ããŸãã åŠçã¢ã«ãŽãªãºã ãç°ãªãã¿ã€ãã®è€æ°ã®ãªããžã§ã¯ãã䜿çšããå Žåããªããžã§ã¯ãèªäœã«ã¢ã«ãŽãªãºã ããã€ã³ããããªããžã§ã¯ãéã®äººçºçãªéå£ãå
æããå¿
èŠã¯ãããŸããã
ããŒã¿æ§é ã®ã»ããã®å€§éšåã¯ã2ã€ã®ã¡ã«ããºã ïŒ ä»£æ°ããŒã¿å ïŒã®ã¿ã䜿çšããŠã¢ãã«åã§ããããšãããããŸã ã ãŸããã¬ã³ãŒããŸãã¯ã¿ãã«ã®äœæïŒãtype-workãïŒã 第äºã«ã1ã€ã®èŠªã¿ã€ãã®ä»£æ¿å®è£
ã®äœæ-åæãã€ã³ã¿ãŒãã§ãŒã¹ã®ç¶æ¿ãå°å°ãããç¹æ§-ãã¿ã€ããµã ãã
äŸïŒ
ã芧ã®ãšããããã®ãããªä»£æ°ããŒã¿åã¯ããŒã¿ã®é èœãçµã¿èŸŒã¿ã¡ãœããã®ååšãæå³ããŸããã ãã¹ãŠã®ããŒã¿ã¯çŽæ¥å©çšã§ãã次ã®ãããªå€éšã¢ã«ãŽãªãºã ã䜿çšããŠãããã®ã¿ã€ããåŠçã§ããŸãã
- ãŠãŒã¶ãŒã®HTMLãã¥ãŒãäœæããŸã
- ããžãã¹ã«ãŒã«ã«åŸã£ãŠæ€èšŒãã
- ã·ãªã¢ã©ã€ãº/ãã·ãªã¢ã©ã€ãº
- ããã€ãã®ææšãèšç®ãã
- ...
ãããã®ã¿ã€ãã®åŠçã¯ãã¹ãŠåå¥ã«å®è£
ããããäºãã«ã€ããŠäœãç¥ãå¿
èŠã¯ãããŸããã ãã®ãããªã¢ã«ãŽãªãºã ã§ã¯ããã¿ãŒã³ãããã³ã°ã¯ãå®éã®ããŒã¿ã«ã¢ã¯ã»ã¹ããŠããŸããŸãªãµãã¿ã€ããåŠçããäž»ãªæ¹æ³ã§ãã ãã¿ãŒã³ãããã³ã°ã®å©ããåããŠããªããžã§ã¯ãã®ç¹å®ã®ãµãã¿ã€ããåæã«ãã§ãã¯ããé¢å¿ã®ãããã£ãŒã«ãã®å€ãæœåºããŸãã
ç¹å®ã®ã¿ã€ãã®å€åŽã«ã¢ã«ãŽãªãºã ãé
眮ãããšã次ã®å©ç¹ããããŸãã
- ã¢ã«ãŽãªãºã ã®ããžãã¯ã¯ãµãã¿ã€ãããšã«å¡ãã€ã¶ãããŠããŸããããåå¥ã®ã¢ãžã¥ãŒã«ã«ããŒã«ã©ã€ãºãããŠããŸãã
- 1ã€ã®åŠçã¡ãœããã®ããžãã¯ã¯ãåããŒã¿ã¯ã©ã¹å
ã®ä»ã®åŠçã¡ãœãããšæ··åšããŠããŸããã ããŸããŸãªéçºè
ã«ããããŸããŸãªã¢ã«ãŽãªãºã ã®ãµããŒãã®ç°¡çŽ åã
- DBMSã¢ãã«ãžã®äŸåé¢ä¿ããããŒã¿ã¢ãã«ã宣èšãããŠããã¢ãžã¥ãŒã«ã«è¿œå ããå¿
èŠã¯ãããŸããã
- æ¢åã®ããŒã¿åã«æ°ããåŠçæ¹æ³ãç°¡åã«è¿œå ã§ããŸãã ãããã¯ãç¬ç«ããã¢ãžã¥ãŒã«ã«ãçŽäº€ããŠãè¿œå ãããŸãã
åã¯ã©ã¹
ããŒã¿å以å€ã®ã¢ã«ãŽãªãºã ãå®è£
ãããšããŸãã ãã®ã¢ã«ãŽãªãºã ã§åãçŽæ¥äœ¿çšãããŠããå Žåãä»ã®åæ§ã®ããŒã¿ã«ãããåå©çšããããšã¯ã§ããŸããã ããã¯ããã®ãããªã¢ã«ãŽãªãºã ã®æ¹ãç°¡åã«æžãããšãã§ãããããäžæ¹ã§ã¯æªããããŸããããäžæ¹ã§ããã®äžè¬æ§ã¯å¶éãããŠããŸãã ããã¯ãäžè¬çãªå Žåãã¢ã«ãŽãªãºã ã®äœ¿çšé »åºŠãäœããªããæããã«ãåãçµæžçã³ã¹ãã§ãã¹ããæªåãããããµããŒãã³ã¹ããé«ããªãããšãæå³ããŸãã
ãããã£ãŠãã¢ã«ãŽãªãºã ãä»ã®ããŒã¿åïŒæ¢åããã³ææïŒã«äžè¬åããã¡ã«ããºã ãå¿
èŠã§ãã ããã«ãããå€ãã®å Žåã«åãã¢ã«ãŽãªãºã ã䜿çšã§ããéçºãšãã¹ãã®ã³ã¹ããååã§ããŸãã
OOPã¯ããé¡äŒŒãããŒã¿ã®å
±éã€ã³ã¿ãŒãã§ãŒã¹ãéžæãããã®å
±éã€ã³ã¿ãŒãã§ãŒã¹ã®èŠ³ç¹ããã¢ã«ãŽãªãºã ãå®è£
ããããšãææ¡ããŠããŸãã ãã®ã€ã³ã¿ãŒãã§ã€ã¹ãç¶æ¿ããå
·äœçãªã¯ã©ã¹ã§ã¯ããããã®äžè¬çãªã¡ãœãããå®è£
ããã ãã§ååã§ãã ãããã£ãŠãããçšåºŠããªã¢ãŒãã£ãã¯ã¢ã«ãŽãªãºã ãååŸããŸãã ãã ãããé¡äŒŒã®ãããŒã¿ã€ã³ã¿ãŒãã§ã€ã¹ã®äžéšã§ãããããã®æäœã¯ãããŒã¿èªäœã«å®è£
ããå¿
èŠããããŸãã
åã¯ã©ã¹ã¯ãããã°ã©ã ã§ããŸããŸãªåœ¹å²ãæããã³ãŒããåé¢ãã次ã®ã¹ããããè¡šããŸãã ããŒã¿ã«å¯ŸããŠå®è¡ããæäœã¯ãããŒã¿ã®ç¥å
ã§ã¯ãªãå¥ã®ã¯ã©ã¹ã«ç§»åãããŸãã ãã®ããŒã¿åã®ãã®ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã¯ãããŒã¿ãšãšãã«ã¢ã«ãŽãªãºã ã«æž¡ãããŸãã
äŸïŒ
èå³ã®ããã¢ã«ãŽãªãºã ã«ããŒã¿æ¯èŒãé çªã«äœ¿çšãããŸãã ãã®ãããªæ¯èŒã¯ãé¢æ°ã§è¡šãããšãã§ããŸã
def compare[T](a: T, b: T): Int
ãã®é¢æ°ãOrdering
åã®ã¯ã©ã¹ã«é
眮ããŸãã
trait Ordering[T] { def compare(a: T, b: T): Int }
次ã«ãæ±çšã¢ã«ãŽãªãºã ããœãŒãããŸãã 䜿çšããŠããããŒã¿ã®ã¿ã€ããåãå
¥ããå¿
èŠããããŸãã
def sort[T](list: List[T]): List[T]
èŠçŽ ã¯ã¢ã«ãŽãªãºã å
ã§æ¯èŒããããããåT
Ordering
ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹T
ãã®ã¢ã«ãŽãªãºã ã«æž¡ãå¿
èŠããããŸãã
def sort[T: Ordering](list: List[T]): List[T]
ãŸãã¯ãåãã§ãïŒ
def sort[T](list: List[T])(implicit o: Ordering[T]): List[T]
ã¢ã«ãŽãªãºã ã¯ã compare
æŒç®ãåŒã³åºãå¿
èŠãããå Žåã implicitly[Ordering[T]].compare(a,b)
ã䜿çšããŠãåã®ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãååŸããå¿
èŠããããŸãã
ããŒã¿åã®åã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã®ã¿ãæäŸã§ããŸãã
implicit object FormOrdering extends Ordering[Form] { def compare(a: Form, b: Form): Int = (a,b) match { case (Form1(numberA, titleA), Form1(numberB, titleB)) => numberA - numberB case (BadForm, BadForm) => 0 ... case _ => 0 } }
ãããã£ãŠãç¹å®ã®ã¢ã«ãŽãªãºã ã«é¢é£ããã³ãŒãã§ããŒã¿ãä¹±éã«ããããšãªããå
±éã®ã¢ã«ãŽãªãºã ãå®çŸããŸãã
ãããªãå©äŸ¿æ§
åèªäœã§ã¡ãœãããçŽæ¥å©çšå¯èœã«ããæ¹æ³ã¯ïŒ ããšãã°ãåã¯ã©ã¹ã¡ãœãããæ瀺çã«åŒã³åºããã«ã a compare b
ã¡ãœããã䜿çšããŠã¢ã«ãŽãªãºã å
ã®ãªããžã§ã¯ããæ¯èŒããããšããŸãã
ãããè¡ãã«ã¯ãScalaã®éåžžã®pimp-my-libraryã¡ã«ããºã ã䜿çšããŸãã
implicit class OrderingOps[T:Ordering](a:T){ def compare(b:T): Int = implicitly[Ordering[T]].compare(a,b) }
ãããã£ãŠã Ordering
ã€ã³ã¹ã¿ã³ã¹ããããã¹ãŠã®ã¿ã€ãã«å¯ŸããŠãæ°ããcompare
ã¡ãœããã衚瀺ãããŸãã
ãã®ãããªèŠæãæ¯åçºçããå Žåã¯ã simulacrumã©ã€ãã©ãªã䜿çšã§ããŸããããã«ããããã¯ãã䜿çšããŠå¿
èŠãªãã¹ãŠã®ãã€ã³ãã£ã³ã°ãåããè£å©ã¡ãœãããäœæãããŸãã
import simulacrum.typeclass @typeclass trait Ordering[T]{ def compare(a: T, b: T): Int }
äŸïŒæšãæžãæããããã®åã¯ã©ã¹ïŒæ¹çšåŒã®èšå·è§£ãããã°ã©ã æé©åïŒ
ã«ã¹ã¿ã ããŒã¿æ§é ã®åã¯ã©ã¹ã®äŸãèããŠã¿ãŸãããã ããã°ã©ã ãæé©åããããã«äœ¿çšãããã¡ã«ããºã ã®1ã€ã¯ãã»ãã³ãã£ã¯ã¹ãç¶æããªããASTãæžãæããããšã§ãã ãã®å ŽåãããªãŒã®ãã¹ãŠã®ããŒããïŒæ·±ããŸãã¯å¹
ã§ïŒãã©ããŒã¹ãããåããŒãã«ã€ããŠã察å¿ãããã¿ãŒã³ãæ€çŽ¢ããïŒãã¿ãŒã³ãããã³ã°ïŒããã¿ãŒã³ãããã³ã°ã®å ŽåãããŒãã¯å¯Ÿå¿ããã«ãŒã«ã«åŸã£ãŠæžãæããããŸãã
ããŸããŸãªã¿ã¹ã¯ïŒæ¹çšåŒãããã°ã©ã ïŒã«å¯ŸããŠãASTããªãŒãæ§æããã¿ã€ãã¯ç°ãªããæ¯èŒ/æé©åãã¿ãŒã³ãç°ãªããŸãã ãã ããåé¿çã¯åãã§ãã
ãã®ã¢ã«ãŽãªãºã ã¯ãåã¯ã©ã¹ã䜿çšããæœè±¡åã®åè£ã§ãã ä»»æã®ã¿ã€ãã®ããªãŒã«ãããªãŒãã©ããŒãµã«ã¢ã«ãŽãªãºã ã§äœ¿çšãããããã€ãã®æäœãè¿œå ããå¿
èŠããããŸãã
import simulacrum.typeclass @typeclass trait RewritableTree[T] { def children(node: T): List[T] def replaceChildren(node: T, newChildren: List[T]): T }
æžãæãã¢ã«ãŽãªãºã èªäœ object RewritableTree { def rewrite[T: RewritableTree](f: PartialFunction[T, T]): T => T = t => { rewrite0(f)(t).getOrElse(t) } private def rewrite0[T: RewritableTree](f: PartialFunction[T, T])(t: T): Option[T] = { import RewritableTree.ops._
åãåã¯ã©ã¹ã䜿çšããŠãããªãŒããã©ããŒã¹ããããšãã«å€ãåécollect
ã¡ãœãããå®è£
ã§ããŸãã
掟çåã®åã¯ã©ã¹ã®åž°çŽçå®çŸ©
åOrdering[T]
ã®åOrdering[T]
ã¯ã©ã¹ãæ¢ã«å®è£
ããŠãããšããŸãT
ãããŠã Option[T]
ãªã¹ãããœãŒãããããšæããŸãã æ¢ã«å®è£
ãããŠããåã¯ã©ã¹ãå©çšããŠãæ¬ èœããŠããæ©èœãåã«è£å®ããããšã¯å¯èœã§ããïŒ
ããã¯ãæ¢åã®åã¯ã©ã¹ããå®è£
ãæ§ç¯ããããšã«ããããã®å Žã§åã¯ã©ã¹ã®å®è£
ãæäŸããå Žåã«å®è¡ã§ããŸãã
implicit def optionOrdering[T:Ordering]: Ordering[Option[T]] = new Ordering[Option[T]] { def compare(a: Option[T], b: Option[T]): Int = (a, b) match { case (Some(c), Some(d)) => implicitly[Ordering[T]].compare(c,d) case (None, None) => 0 case (_, None) => 1 case (None, _) => -1 } }
ãã®ãããªå®è£
ã¯ã Ordering[T]
åã®ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãååšããåã®ãœãŒãã¢ã«ãŽãªãºã ã«èªåçã«æ¿å
¥ãããŸãã
åæ§ã«ã List[T]
ã Tuple2[A,B]
ã...ãªã©ã®ãžã§ããªãã¯åã«å¯ŸããŠåã¯ã©ã¹ãæ§ç¯ã§ããŸãã
æšæºåã¯ã©ã¹ïŒç«ïŒ
åã¯ã©ã¹å
ã§å®£èšãããæäœã¯ä»»æã§ãã ãã®ã¢ã«ãŽãªãºã ã§ã¯ãæœè±¡å¢çç·ãä»»æã«æç»ã§ããŸããããšãã°ãã¢ã«ãŽãªãºã å
šäœãåã¯ã©ã¹ã«å
¥ããããéã«ããŒã¿ã¢ã¯ã»ã¹ã¡ãœãããçŽæ¥åã¯ã©ã¹ã«å
¥ãããã§ããŸãã ãããã®å¢çãªãã·ã§ã³ã¯äž¡æ¹ãšããåå©çšã«é¢ããŠæé©ã§ã¯ãããŸããã ãããã£ãŠãæå°æ°ã®æäœãä»ã®åã«ç°¡åã«å®è£
ã§ããåã¯ã©ã¹ã«å
¥ãã䟡å€ããããåæã«ãããã®æäœãéããŠã¢ã«ãŽãªãºã ãè¡šçŸã§ããŸãã
ãã®èŠ³ç¹ããã¢ã«ãŽãªãºã ãšããŒã¿ã¢ã¯ã»ã¹ãæ€èšãå§ãããšããã«ãäžè¬çã«äœ¿çšãããããã€ãã®åã¯ã©ã¹ã«å°éããå¯èœæ§ããããŸãã
Scalaæšæºã©ã€ãã©ãªã«ã¯ããã€ãã®åã¯ã©ã¹ããããŸãïŒ Ordering[T]
ã Equiv[T]
ã Numeric[T]
ã Integral[T]
ã...
typelevel / catsã©ã€ãã©ãªïŒããã³scalazã©ã€ãã©ãªïŒã§ãé »ç¹ã«äœ¿çšãããæäœãæã€åçŽåã®ããã€ãã®è¿œå ã¯ã©ã¹ã宣èšãããŠããŸãïŒ http://typelevel.org/cats/typeclasses.html ïŒïŒ
- ã»ãã°ã«ãŒã -åäžã®
combine
æäœã - ã¢ãã€ãã¯ã空ïŒããŒããïŒèŠçŽ -emptyã®ã»ãã°ã«ãŒãã§ãã
ããšãã°ãæ°å€ã®å Žåã combine
æäœãæ°å€ã®åèšãšããŠå®çŸ©ã§ããŸãããã®å ŽåããŒãèŠçŽ ã¯éåžžã®ãŒãã«ãªããŸãã å æ³ã¢ãã€ããååŸããŸãã ä¹ç®ãcombine
æŒç®ãšããŠäœ¿çšãã1ã€ãåäœãšããŠäœ¿çšããå Žåãä¹æ³ã¢ãã€ãã䜿çšããããšãã§ããŸãã æ°åã®ãªã¹ãã¯ãã¢ãã€ããšã¿ãªãããšãã§ããŸãã combine
æäœã¯ãªã¹ãã®æ¥çã§ãããnullèŠçŽ ã¯ç©ºã®ãªã¹ãã§ãã
äŸïŒ
ã¢ãã€ãã䜿çšããŠçŽ¯ç©ãå®è£
ã§ããŸãã ã¢ãã€ãããempty
çããåæå€ãæã€ç¶æ
ãäœæããŸãã ããã«ãå
¥åããŒã¿ã®å Žåããã§ã«ç¶æ
ã«ãããã®ãšcombine
ããšãã§ããŸãã ããšãã°ãæäœãsumãã§ã¿ã€ãInt
ãååŸã§ããŸãã ãã®å Žåãçä¿¡ããŒã¿ã®åèšã1ã€ã®å€ã«çŽ¯ç©ãããŸãã ãŸãã¯ã List[T]
ã¢ãã€ããåããŸãã ãã®å Žåããã¹ãŠã®ããŒã¿ããã®ãªã¹ãã§å©çšå¯èœã«ãªããŸãïŒå
¥åæã«ãªã¹ããååšããããåçªå·ããªã¹ãã«ã©ãããããå¿
èŠããããŸãïŒã äž¡æ¹ã®å Žåã®çŽ¯ç©ã¢ã«ãŽãªãºã ã¯åäžã§ã-æ¢åã®ããŒã¿ãšæ°ããããŒã¿ã«å¯ŸããŠcombine
ã¡ãœãããåŒã³åºããŸãã ãŸããã¢ã«ãŽãªãºã ã¯ãåäœããç¹å®ã®ã¿ã€ãã«äŸåããŸããã
ãŸããããã¿ã€ãã«ã€ããŠãããã¢ãã€ãã§ããããšãããã£ãŠããå ŽåïŒã€ãŸãããã®ã¿ã€ãã®ã¢ãã€ãã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãããå ŽåïŒã foldLeft
ã䜿çšã§ããŸã-ãããã®èŠçŽ ã®ã³ã¬ã¯ã·ã§ã³ã®ç³ã¿èŸŒã¿ïŒåå®è£
ããå¿
èŠã¯ãããŸããïŒã
é«æ¬¡ã¿ã€ã
åçŽãªåºæ¬åã«å ããŠãåã¯ã©ã¹ã䜿çšããŠãããèªäœããã©ã¡ãŒã¿ãŒãæã€åãæäœã§ããŸãã ïŒãããã£ãŠãåã¯ã©ã¹ã«ã¯ãèšèªã®é«æ¬¡åã®ãµããŒããå¿
èŠã§ããïŒé«æ¬¡åã¯ãçš®é¡-ãååãã«ãã£ãŠç¹åŸŽä»ããããŸãã
- åçŽåã®çš®é¡ã¯
*
ïŒããšãã°ã Int
ã String
ïŒã§ãã - 1ã€ã®åŒæ°ããšãã¿ã€ã-
* -> *
ïŒããšãã°ã List[T]
ã Option[T]
ã Future[T]
ïŒ; - 2ã€ã®åŒæ°ããšãã¿ã€ã-
* -> * -> *
ïŒããšãã°ãé¢æ°Function1[A,B]
ïŒã ïŒå€ã¬ãã«ã®é¢æ°èªäœã«ã¯1ã€ã®ç¢å°A => B
ãå«ãŸããåã¬ãã«ã§ã¯A => B => (A=>B)
-2ã€ã®ç¢å°ïŒ3çªç®ã®ç¢å°ã¯æ¢ã«åèªäœã®äžã«ãããŸãïŒã
catsã©ã€ãã©ãªã«ã¯ãåºæ¬åã§åäœããåã¯ã©ã¹ã«å ããŠãåã³ã³ã¹ãã©ã¯ã¿ã§åäœãããšãã«äœ¿çšãããåã¯ã©ã¹ããããŸãã ç¹ã«ãã¿ã€ã* -> *
ïŒ
ãã¡ã³ã¯ã¿ãŒã¯ã1ã€ã®æäœmap
ãå«ãåã¯ã©ã¹ã§ãã ãã®æäœã¯ãããšãã°List[Int]
åã®ãªããžã§ã¯ããåãåããæå®ãããé¢æ°ãåèŠçŽ ã«é©çšããŸãã List
ãšOption
å Žåããã®æäœã¯ãäžè¬çã«èšãã°ãããŒã¿åèªäœã«æ¢ã«å®è£
ãããŠããããã®åã®ã¯ã©ã¹ãäœæããªãããšãå¯èœã§ãã ãã ãã map
æäœã䜿çšããŠãŠãããŒãµã«ã¢ã«ãŽãªãºã ãå®è£
ããå Žåã¯ããã®ãããªã¿ã€ãã®ã¯ã©ã¹ãå¿
èŠã§ãã
- Monadã¯ãæäœ
flatMap
ã bind
ãŸãã¯>>=
ïŒããã³flatten
ã map
ã pure
ïŒãå«ããã¡ã³ã¯ã¿ãŒã§ãã ãã®åã¯ã©ã¹ã¯ãæããã«æãæåã§ãã ãã®æçšæ§ã¯ã flatMap
ïŒ bind
ïŒãé次èšç®ãæ¥çããããªãæ®éçãªæ¹æ³ã§ãããšããäºå®ã«ãããã®ã§ãã Scalaã®ç解床ã¯ã flatMap
æäœã«ãåºã¥ããŠããŸãã
äŸïŒ
- ãªã¹ãåŠçã ãªããžã§ã¯ãã®ã³ã¬ã¯ã·ã§ã³ã®ãã¹ãŠã®åãåéããŸã
val allChildren = objects.flatMap(_.children)
- æ¬ æå€ã®åŠçïŒ
val street = personOpt.flatMap(_.addressOpt).flatMap(_.streetOpt)
- ãªã¯ãšã¹ãã®å®è¡ã®é
延ã ããŒã¿ããŒã¹ããã®ã¯ãšãªã®çµæã
DataTable[T]
ã§è¡šãããããã«ãDataTable[T]
ã flatMap
ã䜿çšããŠããã®ã¯ãšãªã®çµæããããŒã¿ãæœåºãããµãã¯ãšãªãå®çŸ©ã§ããŸãã ãã®ãããªã¯ãšãªã¯ãæåã®ã¯ãšãªãå®è¡ããããçµæã®ã³ã¬ã¯ã·ã§ã³ãåŠçãããããããšãªã ãå
ã®ã¯ãšãªã«æ¥çã§ããŸãã æ¥çãããã¯ãšãªãSQLã§ã³ã³ãã€ã«ããDBMSåŽã§å®è¡ããããã«ããŒã¿ããŒã¹ã«éä¿¡ã§ããŸãã ãã®ã¢ãããŒãã¯ãããšãã°Slickã©ã€ãã©ãªã«å®è£
ãããŠããŸãã
catsã©ã€ãã©ãªã®ã¿ã€ã* -> * -> *
ã«ã¯ãã¿ã€ãã®ã¯ã©ã¹ããããŸãã
- ã«ããŽãª -æäœ
compose
+ "null"èŠçŽ identity
ã ã¿ã€ããã«ããŽãªãã®ã¯ã©ã¹ãå®çŸ©ãããŠããã¿ã€ãã¯ããç¢å°ãïŒç¢å°ïŒãšåŒã°ããŸãã ç¢å°ã¯æ©èœã«äŒŒãŠããŸãã ç¹ã«ãéåžžã®é¢æ°ã®å Žåã compose
æäœã¯andThen
ã¡ãœããã«å¯Ÿå¿ãã identity
æäœã¯identity
é¢æ°ã«å¯Ÿå¿ããŸãã
ã«ããŽãªã®äŸïŒ
- éåžžã®æ©èœã
- ã¢ãã«é¢æ°ïŒã¢ãã«èšèªïŒã
- ã¬ã³ãºïŒã¯ã©ã¹ããåé¢ããããªããžã§ã¯ãã®ããããã£ïŒïŒ ã¢ãã¯ã«ã©ã€ãã©ãªãåç
§ïŒã
- æ©èœçåå¿åããã°ã©ãã³ã°ã®æåã°ã©ãïŒäŸïŒ SynapseGrid ïŒã
äŸïŒ
ã«ããŽãªã®å Žåã compose
ã¯éèŠãªæ©èœã§ãã ã€ãŸã ã¢ã«ãŽãªãºã ãæ§æã«é¢ããŠè¡šçŸã§ããå Žåããã®ã¢ã«ãŽãªãºã ãä»»æã®ã«ããŽãªã«é©çšã§ããŸãã
ç¬èªã®DSLã䜿çšããŠãäžé£ã®ããŒã¿å€æãã¢ãã«åããŸãã åå€æã¯ãããã¿ã€ãã®Transform[A,B]
ã§è¡šçŸã§ãããšä»®å®ããŸãã
ãã¡ã³ãã ã¿ã€ãA
ãšB
ã¯ãå¿
ãããããŒã¿ã¢ãã«ã®åã§ã¯ãããŸããã ãããã¯ããããããã¡ã³ãã ã¿ã€ãã«ããããšãã§ããŸã ã ãã¡ã³ãã ã¿ã€ãã䜿çšãããšãã³ã³ãã€ã©ã«ãã£ãŠãã§ãã¯ãããå€æã®èš±å¯ãããçµã¿åããã«å¯ŸããŠç¬èªã®ã«ãŒã«ãå®çŸ©ã§ããŸãã ã€ãŸã äºææ§ã®ãªãå€æã«ã¯compose
ã¡ãœããã䜿çšã§ããŸããã
ãŠãŒã¶ãŒããã®DSLã䜿çšããŠèªåã®ã¿ã¹ã¯ã説æããåŸãæ¡ä»¶ä»ãå€æããå®éã®åã®éåžžã®é¢æ°ã§æ¢ã«è¡šãããŠããããŒã¿ã䜿çšããŠå®éã®ã¢ã¯ã·ã§ã³ã«å€æã§ããŸãã 1ã€ã®ã«ããŽãªïŒã¢ãã«é¢æ°ïŒãå¥ã®ã«ããŽãªïŒå®éã®é¢æ°ïŒã«å€æããããšããèªç¶å€æããšåŒã³ãŸãã
åã¯ã©ã¹ã®æ³åŸ
catsã©ã€ãã©ãªã«å®è£
ãããŠããåã¯ã©ã¹ã¯ãã«ããŽãªçè«ã®æŠå¿µãã¢ãã«åããŸãã ãããã£ãŠããããã®åã¯ã©ã¹ã®ã¡ãœããã¯ãç¹å®ã®ããããã£ïŒçè«ã§èª¬æãããŠããïŒãæºããå¿
èŠããããŸãã ããšãã°ãã¢ãã€ãã®å ŽåïŒ
a combine empty = a = empty combine a
空ã®èŠçŽ ã®å®çŸ©(a combine b) combine c = a combine (b combine c)
- combine
æäœã®combine
åçè«ã®ã«ããŽãªãŒçè«ã«å¿
èŠãªãã¹ãŠã®ããããã£ã¯ããæ³åãã®åœ¢åŒã§å®è£
ãããŸã-ScalaCheckã©ã€ãã©ãªã®ãããããã£ãã®ã»ããã ãŸããåã¯ã©ã¹ã®ã©ã®ã€ã³ã¹ã¿ã³ã¹ã§ãããã®ã€ã³ã¹ã¿ã³ã¹ããã®åã¯ã©ã¹ã®èŠä»¶ãæºãããŠãããã©ããã確èªã§ããŸãã å€ãã®ã¢ã«ãŽãªãºã ã¯ãããã®ããããã£ã«äŸåããŠãããããããŒã¿ã®åã¯ã©ã¹ãå®è£
ãããšãã¯ããŠããããã¹ãã§ãããã®æ³åã確èªããå¿
èŠããããŸãã
åã¯ã©ã¹ã®å®è£
ãæ¢åã®æ³åãæºãããŠããããšã確èªããããåã¯ã©ã¹ã®ãããã®ããããã£ã«åºã¥ãã©ã€ãã©ãªã®ã¢ã«ãŽãªãºã ã䜿çšããããã°ã©ã ã®æ£ç¢ºæ§ãã»ãŒç¢ºä¿¡ã§ããŸãã
ã¿ã€ãã¯ã©ã¹ã®å©ç¹
åå«ã«å®è£
ããå¿
èŠãããåŸæ¥ã®ã€ã³ã¿ãŒãã§ã€ã¹ãšæ¯èŒããŠãåã¯ã©ã¹ã«ã¯æ¬¡ã®å©ç¹ããããŸãã
- ã¢ã¯ã»ã¹ã§ããªãåã®ã¯ã©ã¹ãå®è£
ã§ããŸãã
- ãã®ã¿ã€ãã®ãŒãåã®ã€ã³ã¹ã¿ã³ã¹ã§åäœãããªãã¬ãŒã·ã§ã³ã宣èšã§ããŸãã ç¹ã«ã
empty: T
ã¡ãœããããŸãã¯parse: String => T
ã¡ãœããparse: String => T
; - åºæ¬åã®ã€ã³ã¹ã¿ã³ã¹ãããå Žåãè€ååã®ã€ã³ã¹ã¿ã³ã¹ãåž°çŽçã«å®çŸ©ã§ããŸãã ããšãã°ã
Option[T]
ãŸãã¯A \/ B
ãããã®å©ç¹ã¯ãã©ã®ããã°ã©ã ã§ãç¬ç«ããŠäœ¿çšã§ããŸãã ã³ãŒãã®æ§é ãèŠãŠã¿ãã ãã§ååã§ãã
catsã©ã€ãã©ãªãŒïŒããã³scalazã©ã€ãã©ãªãŒïŒã«ã¯ãå€ãã®ã¢ã«ãŽãªãºã ãšã©ã€ãã©ãªãŒã§äœ¿çšãããïŒã«ããŽãªçè«ããã®ïŒããçµç¹ãããã¹ããããäžé£ã®åã¯ã©ã¹ããããŸãã , , .