ããŒã1.æ©èœç
ãã®èšäºïŒå®å
šã«æ£çŽã«èšããšäžé£ã®ã¡ã¢ïŒã¯ãåå¿è
ã ãã§ãªããåŸèŒ©ã ãã§ãªããç°è²ã®ã²ããæã€çµéšè±å¯ãªããã°ã©ããŒã«ãScalaã®éãæ©ããšãã«ç¯ãééãã«ã€ããŠèª¬æããŠããŸãã ãããã®å€ãã¯ãCãC ++ãJavaãªã©ã®åœä»€åèšèªã§ã®ã¿åžžã«æ©èœããŠãããããScalaã®ã€ãã£ãªã ã¯ç解ã§ãããããã«æããã§ã¯ãããŸããã ãããã£ãŠãç§ã¯èªç±ã«ãæ¹å®è
ã«èŠåãã圌ãã®å
žåçãªéã¡ã«ã€ããŠè©±ããŸã-å®å
šã«ç¡å®ã§ãããæ»ã«ãã£ãŠçœ°ããããScalaã®äžçã®éã¡ã§ãã
ãããªã±ãŒã·ã§ã³æ§é ïŒ
åå ãã代ããã«
ç§ã®ãã£ãªã¢ã®æåã«ãç§ã¯éåžžã«èå³æ·±ãç¶æ³ã«ããããšã«æ°ã¥ããŸãããç§ã¯åœæãŸã è¥ãéçºè
ã§ããããç§ã®å¹Žäžã®ååã«å²©ã®ãããªã€ãã£ãªã ã説æããªããã°ãªããŸããã§ããã ããã¯ãšãŠãèµ·ãããŸãã-ãããŠãç§ã¯ãã®å€§ãã«è²Žéãªçµéšã«äººçã«æè¬ããŠããŸãã çŸåšãç§ãåããŠããäŒç€Ÿã«ã¯ç€Ÿå
ã®åŸæ¥å¡ãã¬ãŒãã³ã°ã·ã¹ãã ããããããScalaã®éçºãæ¯æŽããããã«ãå°èŠæš¡ãã倧èŠæš¡ãŸã§ãããããã¬ãã«ã®éçºè
ãæ¯æŽããŠããŸãã çŸæç¹ã§ã¯ãç§ã¯ä»ã®ã¡ã³ã¿ãŒãšäžç·ã«Scalaã³ãŒã¹ã®ãã¹ããšãµããŒããè¡ã£ãŠããŸãã
ããšããšããã®èšäºã¯è±èªã§ãããžã¥ãã¢ãšãžã¥ãã¢ã·ãã¢åãã®ã¹ã«ã©ããšããã¿ã€ãã«ã§æžãããŠããŸããã ãããããã·ã¢èªã®ããã¹ãã§äœæ¥ããæ¹ãã¯ããã«é«éã§äŸ¿å©ã§ããããšãå€æãããããã¿ã€ãã«ã«ç¿»èš³ã§ããªãããããç ç²ã«ããªããã°ãªããŸããã§ããã ãã®èšäºã¯ãçŽç²ãªåŸèŒ©ã ãã§ãªããåœä»€åããã°ã©ãã³ã°ã®çµéšã«é¢ä¿ãªããScalaèšèªã«ç²ŸéããŠãããã¹ãŠã®äººã察象ãšããŠããŸãã
ãã®èšäºã¯ãæŠããŠãå®çšçãªãã³ãã®å¯ãéãã§ããããã®èŠ³ç¹ãããè³æã®ãã¬ãŒã³ããŒã·ã§ã³ã®è€éãªãã«ãã¬ãã«ã®åŠè¡çæ§é ãæ¬ ããŠããŸãã 代ããã«ããã®èšäºã¯2ã€ã®ããŒãã«åãããŠããŸããæåã¯Scalaã§ã®é¢æ°åããã°ã©ãã³ã°ã®ã€ãã£ãªã ã«ã€ããŠèª¬æãã2çªç®ã¯ãªããžã§ã¯ãæåã®ã€ãã£ãªã ã«ã€ããŠèª¬æããŸãã ãããŠãScalaã®æãéå°è©äŸ¡ãããŠããæ©èœ-ã¿ã€ããšã€ãªã¢ã¹ããå§ããŸãã
ã¿ã€ããšã€ãªã¢ã¹ã«ã€ããŠ
ãããŸã§typedef
ã®çµéšããªãã£ãå€ãã®åå¿è
éçºè
ã«ãšã£ãŠããã®èšèªã®æ©èœã¯åœ¹ã«ç«ããªãããã«æãããŸãã ãã ããããã¯å®å
šã«çå®ã§ã¯ãããŸãããCã§ã¯ãåãšã€ãªã¢ã¹ã¯ãã¹ãŠã®ã¹ãããã§æšæºã©ã€ãã©ãªã«ãã£ãŠäœ¿çšããããã©ãããã©ãŒã éã®ã³ãŒãã®ç§»æ€æ§ã確ä¿ããæ段ã®1ã€ã§ãã ããã«ããããã¯ã³ãŒãã®èªã¿ãããã倧å¹
ã«æ¹åããŸããã³ãŒãã«ã¯ãéæ¥æ§ã®å€§ããªãã€ã³ã¿ãŒãå«ãŸããŸãã ããç¥ãããäŸ- signal
é¢æ°ã®æšæºçãªå®£èšã¯å®å
šã«èªããŸããïŒ
void (*signal(int sig, void (*func)(int)))(int)
ãã ããã·ã°ãã«ãã³ãã©ãŒé¢æ°ãžã®ãã€ã³ã¿ãŒã®ãšã€ãªã¢ã¹ãè¿œå ãããšããã®åé¡ã¯è§£æ±ºããŸãã
typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler);
C ++ã§ã¯ãåãšã€ãªã¢ã¹ãªãã§ã¯éçã¡ã¿ããã°ã©ãã³ã°ã¯èããããŸãããããã«ããã³ãã¬ãŒãåã®å®å
šãªååã«å€¢äžã«ãªããªãããã«ããŸãã
OcamlãHaskellãªã©ã®èšèªã«ã¯type
ããŒã¯ãŒããããããã®ã»ãã³ãã£ã¯ã¹ã¯Scalaã®å Žåãããã¯ããã«è€éã§ãã ããšãã°ã type
ããŒã¯ãŒãã䜿çšãããšã åã®å矩èªã ãã§ãªãã 代æ°çãªããŒã¿åãäœæã§ããŸãã
(* Ocaml*) type suit = Club | Diamond | Heart | Spade;;
ããã¯ãOcamlãšSMLã§äœæããããšãã§ããŸãã
ãŠããªã³åïŒãŠããªã³åïŒïŒ
(* OCaml *) type intorstring = Int of int | String of string;; (* SML *) datatype intorreal = INT of int | REAL of real
çŸæç¹ïŒScala 2.12ïŒã§ã¯ãæ¹æ³ãããããŸãããtypeããŒã¯ãŒãã䜿çšããŠå®£èšãããæ©èœã¯ã type
å矩èªåã«éå®ããããã¹äŸååã宣èšããŸãã ãã ããå°æ¥ã®ããŒãžã§ã³ã§ã¯ããã®æ©èœãè¿œå ãããäºå®ã§ãïŒ èª¬æã«ã€ããŠã¯ seniaã«æè¬ããŸã ïŒã æ¢ã«æ¢ç¥ã®ã¿ã€ãã«ä»ã®ååãä»ããå¿
èŠãããã®ã¯ãªãã§ããïŒ ãŸããããã¯è¿œå ã®ã»ãã³ãã£ãã¯ããŒããè¿œå ããŸããããšãã°ã DateString
åã®æå³ã¯åãªãString
ãããç解ãããããªãã Map[Username, Key]
ã¯Map[String, String]
ãããè¯ãèŠããŸãã 第äºã«ãå矩èªåã«ããã倧ããè€éãªã¿ã€ãã®çœ²åãæžããããšãã§ããŸãã Map[Username, Key]
ã¯èŠæ ããè¯ãã§ããã Keystore
ãã£ãšçããããç解ããããã§ãã
ãã¡ãããã·ããã åã«ã¯æ¬ ç¹ããããŸãPerson
åã衚瀺ããããªããžã§ã¯ããã¯ã©ã¹ããŸãã¯ãšã€ãªã¢ã¹ã§ãããã©ãããç解ã§ããŸããã
ãã®ããŒã«ãæªçšããããšã¯ééããªã䟡å€ããããŸããããå®éã«åœ¹ç«ã€ç¶æ³ãããã€ããããŸãã
- ç¹å®ã®ã¢ã¯ã·ã§ã³ã«é¢é£ä»ããããšãã§ããé¢æ°ããããŸããååãå€æŽããŠãã
() => Unit
ãªã©ã®çœ²åã§èªè
ãæããããããšã¯ã§ããŸããããã®ã¿ã€ãã®é¢æ°ãAction
ãšããååã«é¢é£ä»ããŸãã [, []]
æœè±¡åããŠã[, []]
- æ¢åã®ã¿ã€ãã«è¿œå ã®ã»ãã³ãã£ãã¯æ
å ±ãè¿œå ããŸã
ããã§ããå€ãã®äŸãèŠã€ããããšãã§ããŸããäŸã®ã»ã¯ã·ã§ã³ãŸã§å°ãäžã«ã¹ã¯ããŒã«ããŠãã ããã
å²ãåœãŠã«ã€ããŠããäžåºŠ
Scalaã®å²ãåœãŠã¯ãããªããæ
£ããŠãããã®ã§ã¯ãããŸããã ãã®æäœãèŠãŠã¿ãŸããããäžèŠããã»ã©ç°¡åã§ã¯ãªãããšãããããŸãã
// , scala> val address = ("localhost", 80) address: (String, Int) = (localhost,80) scala> val (host, port) = address host: String = localhost port: Int = 80
ã¿ãã«ã2ã€ã®å€æ°ã«ãœãŒãããã°ããã§ãããåé¡ã¯ã¿ãã«ã«éå®ãããŸããã
scala> val first::rest = List(1,2,3,4,5) first: Int = 1 rest: List[Int] = List(2, 3, 4, 5)
case class
åæ§ã®æäœãå®è¡ã§ããŸãã
case class Person(name: String, age: Int) val max = Person("Max", 36)
ããã«ïŒ
scala> val p @ Person(n, a) = max
åŸè
ã®å Žåãååp
ã§case class
ã¬ã³ãŒãèªäœãååŸããåån
ã§ååãååŸããŸãïŒa-幎霢ïŒã
æŽç·Žãããèªè
ã¯ãå²ãåœãŠããã¿ãŒã³ãããã³ã°ãšãŸã£ããåãããã«åäœããããšã«ãã§ã«æ°ä»ããŠããŸãã åæ§ã®æ©èœã¯ãPythonãErlangãªã©ã®ä»ã®èšèªã§ãå®è£
ãããŠããŸãã ãã®æ©èœã¯ãäž»ã«ããŒã¿æ§é ã解åããããã«äœ¿çšããŸãã ãã ããä¹±çšããªãã§ãã ãããè€éãªããŒã¿æ§é ã解åãããšãèªã¿ãããã倧å¹
ã«äœäžããŸãã
ãªãã·ã§ã³
å€ãã®äººã¯ãã§ã«Java 8ã®Optional
åã«ç²ŸéããŠããŸããScalaã§ã¯ã Option
åã¯åãæ©èœãå®è¡ããŸãã ãŸããå€ãã®Javaæ¯æè
ã«ãšã£ãŠããã®ã¿ã€ãã¯Guavaã®Googleã©ã€ãã©ãªããç¥ãããŠãããããããŸããã
ã¯ãã Optional
䜿çšããŠnull
ãåé¿ããåŸã§NullPointerException
ãåé¿ãnull
ã ã¯ãã isEmpty
ããã³nonEmpty
ãŸãã Guavaããªã¢ã³ãã«ã¯isPresent
ã¡ãœããããããŸãã ãŸããJavaããã®ä»ã®èšèªã§Optional
ã䜿çšããã䜿çšããŠããªãå€ãã®äººãScalaã§Optional
ã誀çšããŠããŸãã
ãã ãã Optional
ãSkalov map
ãšåæ§ã«åäœããåãGuavaã§å®çŸ©ãããtransform
ã¡ãœããOptional
ããããšã«æ°ã¥ããŠããããã§ã¯ãããŸããã
Option
誀çšã¯äžè¬çãªåé¡ã§ãã Option
ã ãŸããååšããªãå¯èœæ§ã®ãããšã³ãã£ãã£ãæŠå¿µçã«ç€ºãããã«å¿
èŠã§ãããNPEããéããªãããã«å¿
èŠã§ãã ã¯ããåé¡ããããåé¡ã¯æ·±å»ã§ãã 誰ããããã®ããã«åœŒèªèº«ã®èšèªãçºæãããããŸãã ããããScalaã®Option
ã®èª€çšã«æ»ããŸãããã
if (option.isEmpty) default else // c NoSuchElementException ( ) option.get
ãã§ãã¯ãè¡ã£ãŠããŸãããããã§ççºãããã®ã¯ãªãããã§ãã ç§ãä¿¡ããŠãã ãããããªãã¯ç£æ¥ã³ãŒãã§ééããç¯ãããšãã§ããŸãããããŠãæ¡ä»¶ã¯äºæ³ãããè¡šçŸã§ãªããããããŸããã ãŸãããã¹ãã®ã¹ãã«ãééã£ãŠããå¯èœæ§ããããŸãã ããªãã«ãã£ãŠã§ã¯ãªããããªãã®åä»»è
ã«ãã£ãŠã
äžè¬ã«ãäžèšã®äŸã«ã¯å¥ã®åé¡ããããŸãã ããªãã®ãããŒã¯äœããã®ããŒã«å€ã«äŸåããŠããããã®æŽåæ§ã䟵害ãããŠããŸãã
äžéšã®éçºè
ã¯ããã§ã«ãæ©èœãããã³ãŒãçšã«ãã¹ããã«ã¹ã¿ãã€ãºããæ©èœãåããŠããŸãã äžèšã®ã³ãŒããããæ£ç¢ºã§çãã³ãŒãã¯ã次ã®ããã«èšè¿°ã§ããŸãã
option getOrElse default
ã³ãŒããã³ã³ãã¯ãã«ããã°ããã»ã©ãã³ãŒãå
ã®ãšã©ãŒãèŠã€ãããããªãããã¹ãç¯ãã«ãããªããŸãã ããŸããŸãªOption
ãé£éã§ãã䟿å©ãªorElse
ã¡ãœããããããŸãã
Optionå
ã«å€ãååšããå Žåããã®å€ãå€æããå¿
èŠããããŸãã ããã«ã¯map
ã¡ãœããããããŸããå€ãååŸããŠå€æããã³ã³ããã«æ»ããŸãã
val messageOpt = Some("Hello") val updMessageOpt = messageOpt.map(msg => s"$mgs cruel world!") updMessageOpt: Option[String]
ãããŠæã
ããã¯æ¬¡ã®ããã«èµ·ãããŸãïŒ
val messageOptOpt = Some(Some("Hello"))
Option
ã¯éåžžã«ãã¹ãã§ããŸãã ãã®åé¡ã¯ã flatMap
ã¡ãœãããŸãã¯flatten
ã¡ãœããã«ãã£ãŠè§£æ±ºãããŸãã æåã¯map
ãšåæ§ã«æ©èœãmap
-å
éšå€ãå€æããŸãããåæã«æ§é ãåçŽåãã2çªç®ã¯åçŽã«æ§é ãåçŽåããŸãã
Option
ãè¿ãç¹å®ã®é¢æ°ããããšæ³åããŠãã ããïŒ
def concatOpt (s0: String, s1: String) = Option(s0 + s1)
ãã®åŸãåæ§ã®çµæãåŸãããŸãã
messageOpt.map(msg => concatOpt(msg, " cruel world")) res0: Option[Option[String]] = Some(Some(Hello cruel world)) // `flatMap`: messageOpt.flatMap(msg => concatOpt(msg, " cruel world")) res6: Option[String] = Some(Hello cruel world) // flatten messageOptOpt.flatten == Some("Hello") res1: Option[String] = Some(Hello)
Scalaã«ã¯ã Option
ãäœæ¥ã倧å¹
ã«ä¿é²ã§ããå¥ã®ã¡ã«ããºã ãããããç解ã®ããããšããååã§ç¥ãããŠããå ŽåããããŸãã
val ox = Some(1) val oy = Some(2) val oz = Some(3) for { x <- ox; y <- oy; z <- oz } yield x + y + z // res0: Option[Int] = 6
Option
ã¿ã€ãã®ãããããNone
ã«çããå Žåã yield
åŸyield
ãŠãŒã¶ãŒã¯ç©ºã®ã³ã³ãããŒããŸãã¯ç©ºã®ã³ã³ãããŒã®å€ãåãåããŸãã Option
ã®å ŽåOption
ããã¯None
ã§ãã ãªã¹ãã®å Žåã Nil
ã
ãããŠæãéèŠãªããšã¯ã get
ã¡ãœãããåŒã³åºããªãããã«ããããã«ããããããšãè©Šã¿ãããšã§ãã ããã¯æœåšçãªåé¡ã«ã€ãªãããŸãã
ç§ã¯ããªãããããã£ããšãã¹ãŠããã§ãã¯ããããšãç¥ã£ãŠããŸãã ããªãã®ãæ¯ãããããæããšæããŸãããããã¯ããªãget
åã³åŒã£åŒµãçç±ãäžããŸããã
ãªã¹ã
Option
ã¯get
ããããªã¹ãã«ã¯head
ã init
ããã³tail
ãããinit
ã 空ã®ãªã¹ãã§äžèšã®ã¡ãœãããåŒã³åºãããšã§ååŸã§ãããã®ã次ã«ç€ºããŸãã
ãã¡ããã空ã®ã·ãŒãããã§ãã¯ããå Žåãããã¯ããªãã«èµ·ããããšã¯ãããŸããã
åå¿è
ããã«ãŒã¯ãæªåé«ãif
- else
ã³ã³ã¹ãã©ã¯ãã䜿çšããŠãããè¡ããŸãã
list.head
ãšä»²éãåŒã³åºãããšã¯ãèªåèªèº«ã殺ãããã®æè¯ã®æ¹æ³ã®1ã€ã§ãã
ãªã¹ãã®æäœäžã«ã¹ãªãŒãããŸãã
ã¬ã©ã¬ã©ãããlist.head
ã list.head
ãšãã®åéã䜿ããªãããã«ã§ããéãã®ããšãããŠlist.head
ã
head
代ããã«ã headOption
ã¡ãœããã䜿çšããããšããheadOption
ãŸãã lastOption
ã¡ãœãããåæ§ã«åäœããŸãã äœããã®æ¹æ³ã§ã€ã³ããã¯ã¹ã«ã¢ã¿ãããããŠããå Žåã isDefinedAt
ã¡ãœããã䜿çšã§ããŸãã isDefinedAt
ã¡ãœããã¯ããã©ã¡ãŒã¿ãŒãšããŠæŽæ°ã®åŒæ°ïŒã€ã³ããã¯ã¹ïŒãåããŸãã äžèšã®ãã¹ãŠã«ã¯ãå¿ããããšãã§ãããã§ãã¯ãå«ãŸããŠããŸãã ããªããæèçã«ããããçç¥ããããäžã€ã®çç±ããããŸãã æ£ããæ
£çšçãªä»£æ¿æ段ã¯ããã¿ãŒã³ãããã³ã°ã䜿çšããããšã§ãã ãªã¹ãã代æ°åã§ãããšããäºå®ã«ããã Nil
ãå¿ããããšã¯ãããŸããNil
ãštail
åŒã³åºããå®å
šã«åé¿ã§ããæ°è¡ã®ã³ãŒããä¿åã§ããŸãã
def printRec(list: List[String]): Unit = list match {
ããã©ãŒãã³ã¹ã«ã€ããŠå°ã
åäžãªã³ã¯ãªã¹ãïŒSkalov List
ïŒå¥åscala.collection.immutable.List
ïŒïŒã®ããã©ãŒãã³ã¹ã®èŠ³ç¹ããèŠããšãæãå®äŸ¡ãªæäœã¯ããªã¹ãã®æåŸã§ã¯ãªãå
é ã«æžã蟌ãããšã§ãã ãªã¹ãã®æåŸã«æžã蟌ãã«ã¯ããªã¹ãå
šäœãæåŸãŸã§èª¿ã¹ãå¿
èŠããããŸãã ãªã¹ãã®å
é ãžã®æžã蟌ã¿ã®è€éãã¯OïŒ1ïŒããOïŒnïŒã®çµãããŸã§ã§ãã ãããå¿ããªãã§ãã ããã
ãªãã·ã§ã³[ãªã¹ã[ïŒ]]
Option[List[A]]
ãããããŸããé »åºŠã§Scalaã«äŒã£ãã°ããã®äººã®ã³ãŒãã«ãããŸãã é¢æ°ã®åŒæ°ãšæ»ãå€ã®åã®äž¡æ¹ã å€ãã®å Žåããã®ãããªåäœãäœæãã人ã¯æ¬¡ã®åŒæ°ã䜿çšããŸããããªã¹ãããããããããŸãããã代ããã«null
ã䜿çšããã®ã¯äœã§ããïŒã
ããŠãå¥ã®ç¶æ³ãæ³åããŠã¿ãŸãããã Option
ã¯æŠå¿µçã«èãããã倱æããçµæãè¡šãããªã¹ãã¯è¿ãããããŒã¿ã®ã»ããã§ãã Option[List[Message]]
ãè¿ããµãŒããŒããããšæ³åããŠOption[List[Message]]
ã ãã¹ãŠãé 調ã§ããã°ã Some
å
ã®ã¡ãã»ãŒãžã®ãªã¹ããååŸããŸãã ã¡ãã»ãŒãžããªãå Žåã Some
å
ã«ç©ºã®ãªã¹ããååŸããŸãã ãµãŒããŒã§ãšã©ãŒãçºçããå Žåã None
ãååŸããŸãã åççã§å®è¡å¯èœã§ããïŒ
ãããŠããïŒ ã·ã¹ãã ã§ãšã©ãŒãçºçããå¯èœæ§ãããå Žåãã©ã®ãšã©ãŒãç¥ãå¿
èŠããããŸãã ãã®ããã«ã Throwable
ãŸãã¯äœããã®ã³ãŒããè¿ãå¿
èŠããããŸãã Option
ã¯ãããå¯èœã«ããŸããïŒ å®éã«ã¯ããã§ã¯ãããŸãããã Try
and Either
ã¯ãããæ¯æŽããŸãã
Option
ããã«ãªã¹ãã¯ç©ºã«ããããšãã§ãããããäœãåé¡ãçºçããå Žåã«ç©ºã®ãªã¹ããå®å
šã«æž¡ãããšãã§ããŸãã Option[List]
ã³ã³ã¹ãã©ã¯ããå®è¡å¯èœãªåäŸã¯ãŸã èŠãŠããŸããã ãã®ãããªäŸãããã°ãšãŠãå¬ããã§ãããç§ãšå
±æããã§ãããã
ãªãã·ã§ã³[A] =>ãªãã·ã§ã³[B]
æè¿ã Option
å¥ã®èå³æ·±ãã¢ããªã±ãŒã·ã§ã³ã«åºäŒããŸããã 次ã®é¢æ°ã®ã·ã°ããã£ãèŠãŠã¿ãŸãããã
def process (item: Option[Item]): Option[UpdatedItem] = ???
è¿œå ã®ã³ã³ããã䜿çšããŠå€æãè€éã«ããå¿
èŠã¯ãããŸãããããã«ãããé¢æ°ã®æ±çšæ§ãäœããªããé¢æ°ã®ã·ã°ããã£ãèŠèŠçã«ä¹±éã«ãªããŸãã 代ããã«ãã¿ã€ãA => B
é¢æ°ã䜿çšããŠãã ããA => B
ãŸããå
ã®ã³ã³ããã®ã¿ã€ããä¿åããå Žåã¯ãå
ã®çµæããã®ã³ã³ããã«ã©ãããã map
ãŸãã¯flatmap
map
flatmap
ã䜿çšããŠããã«ããŒã¿ãå€æããŸãã
ã¿ãã«
ã¿ãã«ïŒã¿ãã«ïŒã®ååšã¯ãå€ãã®é¢æ°åïŒã ãã§ãªãïŒèšèªã®èå³æ·±ãæ©èœã§ãã é¢æ°åèšèªã§ã¯ãã¿ãã«ã¯ã¬ã³ãŒããšåãæ¹æ³ã§äœ¿çšã§ããŸãã ã¿ãã«ãå¿
èŠãªããŒã¿ã§èšè¿°ããæ°ããã¿ã€ãã«ã©ããããŸããããšãã°ã Haskellã§newtype
ã䜿çšããŠãçµæãšããŠããŠãŒã¶ãŒãäœãç¥ããªãå®è£
ã®æ°ããã¿ã€ããååŸããŸãã ã¿ãã«ã®ãªãçŽç²ã«æ©èœçãªèšèªã§ã¯ãã©ãã«ããããŸãããèŸæžãå®å
šã«æ瀺ã§ããŸãã ãããã®ãªãé©åœã¯ããã»ã©æçœã§ã¯ãããŸããã
Erlangãªã©ã®äžéšã®èšèªã§ã¯ãã¬ã³ãŒãã¯ã¿ãã«ãããã¯ããã«é
ããŠè¡šç€ºãããŸããã ããã«ãErlangã®ã¬ã³ãŒããã¿ãã«ã§ãã
Scalaã¯ãªããžã§ã¯ãæåèšèªã§ãã ã¯ããé¢æ°åããã°ã©ãã³ã°èŠçŽ ããµããŒãããŠããŸãã å€ãã®äººãç§ã«å察ãããšç¢ºä¿¡ããŠããŸãããScalaã§ã¯ãã¹ãŠããªããžã§ã¯ãã§ããããšãå¿ããªãã§ãã ããã case
ã¯ã©ã¹ã®ååšã¯case
ã¿ãã«ã®å¿
èŠæ§ã倧å¹
ã«æžãããŸããäžå€ã®ã¬ã³ãŒããååŸãããã¿ãŒã³ãšæ¯èŒããããšãã§ããŸãïŒããã«ã€ããŠã¯åŸã§èª¬æããŸãïŒã åcase
ã¯ã©ã¹ã«ã¯ç¬èªã®ã¿ã€ãããããŸãã
ã¿ãã«ã¯ãå€ãã®å Žåããªããžã§ã¯ãæåèšèªã®åºèº«è
ã䜿çšããå¿
èŠããããŸãããããã®èšèªããŒã«ã«èå³ããããŸãã ãããããååã¯ä»ããããŠããŸããã
ã¿ãã«ãå¿åã®ã¬ããŒãžãã³ããšããŠäœ¿çšãããªãå Žåã¯ãååãä»ããå¿
èŠããããŸãã
ã¿ãã«ã䜿çšããŠããŒã¿ãä¿åããcase class
ããã®ããã«case class
ã䜿çšããŸãã
æ©èœçãªã¹ã¿ã€ã«ã®å Žåãåè¿°ã®åã®ãšã€ãªã¢ã¹ã䜿çšããããšããå§ãããŸãïŒåãšã€ãªã¢ã¹ïŒïŒ
type Point = (Double, Double)
å°æ¥çã«ã¯ãéåžžã«ååã®ä»ããåãåç
§ããããã«ãªããŸããããã®ãããªã²ã©ããã®ã¯ãªããªããŸãã
// def drawLine(x: (Double, Double), y: (Double, Double)): Line = ??? // def drawLine(x: Point, y: Point): Line = ???
Scalaã§ã¯ãã€ã³ããã¯ã¹ã«ãã£ãŠtupleèŠçŽ ã«ã¢ã¯ã»ã¹ããããšãã§ããŸãã äŸïŒ
ã³ã¬ã¯ã·ã§ã³ãæäœããŠãããšãã¯ç¹ã«æ²ããããã§ãïŒ
// ! points foreach { point: Point => println(s"x: ${point._1}, y: ${point._2}") }
ãããŠãããªãã¯ãããããå¿
èŠã¯ãããŸããã ãã¡ããããã®ãããªæ段ãèªã¿ããããé«ããäŸå€çãªã±ãŒã¹ããããŸãïŒ
ãã ããã»ãšãã©ã®å Žåãäžç·ä»ãã®æ§æã¯é¿ããã®ãæåã§ãã äžè¬ã«ã圌ã«ã€ããŠã¯å¿ããŠãèŠããŠããªãæ¹ãè¯ãã§ãã Scalaã«ã¯ããã®æ§æã䜿çšããªãèªç¶ãªæ¹æ³ããããŸãã
Scalaã§ã¯ã pair._2
ãªãã§ãã€ã§ãå®è¡ã§ãpair._2
ã ãããŠããããè¡ãå¿
èŠããããŸãã
ãã¹ãŠãããã§ããçç±ãç解ããŠç解ããããã«ãé¢æ°åèšèªã«ç®ãåããŸãããã
質å ïŒèŠªæãªãç·šéè
ããªãScalaã®ãªã¹ãã€ã³ããã¯ã¹ã¯ãŒãããå§ãŸããã¿ãã«ã¯1ããå§ãŸãã®ã§ããïŒ ã¯ã·ãªãŒããããã³ã¹ã¯ã
åç ïŒããã«ã¡ã¯ããŽã¡ã·ãªãŒã çãã¯ç°¡åã§ãããªããªããããã¯æŽå²çã«èµ·ãã£ãããã§ãã SMLã«ã¯ãã¿ãã«èŠçŽ ã«ã¢ã¯ã»ã¹ããããã®é¢æ° #1
ããã³#2
ãååšããŸãã Haskell
ã¯ãã¿ãã«èŠçŽ ã«ã¢ã¯ã»ã¹ããããã®2ã€ã®é¢æ°fst
ãšsnd
ãŸãã
ããããã¿ãã«ã®3çªç®ãŸãã¯5çªç®ã®èŠçŽ ãååŸããã ãã§ã¯ããŸããããŸããã ä¿¡ããããªãïŒ ããããç¡é§ã« ã ãããŠããµã³ãã«ãšã®æ¯èŒãæãèªç¶ã§ãããšããªããèšããªãã°ããããä¿¡ããªãã§ãã ããã ãããŠHaskell
ã ãã§ãªãã
Occaml
let third (_, _, elem) = elem
ã¢ãŒã©ã³
1> Tuple = {1,3,4}. {1,3,4} 2> Third = fun ({_Fst, _Snd, Thrd}) -> Thrd end. #Fun<erl_eval.6.50752066> 3> Third(Tuple). 4
Python
ãããŠãããã¯é¢æ°åèšèªã§ã¯ãªãäŸã§ãïŒ
>> (ip, hostname) = ("127.0.0.1", "localhost") >>> ip '127.0.0.1' >>> hostname 'localhost' >>>
ãã®ç¥èãScalaã«é©çšããŸããã
// , trait Rectangle { def topLeft: Point ... } // val (x0, y0) = rectangle.topLeft // : points foreach { case (x, y) => println(s"x: ${x}, y: ${y}") }
match
ããŒã¯ãŒãã䜿çšããæšæºã®ãããã³ã°ã¡ã«ããºã ããã£ã³ã»ã«ãããŠããŸããã
ã¿ãã«ã¯å¿åã®ã¬ããŒãžãã³ããšããŠã䜿çšã§ããããã¯æ£åœåãããå ŽåããããŸãã å®éãå€ãã®é¢æ°åèšèªã§ã¯ãé¢æ°ã·ã°ããã£ã®ã¬ãã«ã§ãµã³ãã«ãšæ¯èŒãããŠããŸãã
-- haskell -- : map :: (a -> b) -> [a] -> [b] -- -- -- -- : map _ [] = [] -- x:xs , , -- Haskell head:tail . : - cons -- :: map fun (head:tail) = fun head : map fun tail
åæ§ã®ã¡ã«ããºã ãSMLãšErlangã§äœ¿çšãããŠããŸãã æ®å¿µãªãããScalaã¯ãã®ãããªæ©äŒã奪ãããŠããŸãã ãããã£ãŠãã¿ãã«ã¯ãã°ã«ãŒãåããã³ãµã³ãã«ãšã®åŸç¶ã®ãããã³ã°ã«äœ¿çšã§ããŸãã
// Haskell, :( def map [A, B] (f: A => B, l: List[A]): List[B] = (f, l) match { case (f, Nil) => List.empty case (f, head::tail) => f(head) :: map(f, tail) }
å€ãã®å Žåãã¿ãã«ã®äžéšã®èŠçŽ ã®å€ãæŽæ°ããå¿
èŠããããŸãã copy
æ¹æ³ã¯ããã«é©ããŠããŸãã
val dog = ("Rex", 13) val olderDog = tuple.copy(_2 = 14)
Haskellããã³SMLã§ã® ã¿ãã«ã®äœ¿çšã«ã€ããŠã¯ããªã³ã¯ãã¯ãªãã¯ããŠèªãããšãã§ããŸãã
å®éã«ã¯ãã¿ãã«ã䜿çšããããšã¯ïŒå°ãªããšãScalaã§ïŒåº§æšãè¡šãæè¯ã®æ¹æ³ã§ã¯ãããŸããã Scalaã§ã¯ããã®ããã«case class
ã¯ã©ã¹ã䜿çšããããšããå§ãããŸãã ã¿ãã«ã®å¿
èŠæ§ã¯ãäž»ã«ãè€åã¬ã³ãŒããäžè¬åããã圢åŒã§æããããå¿
èŠãããå Žåã®ãŠãããŒãµã«ã©ã€ãã©ãªã®ååšã«ãã£ãŠæ±ºãŸããŸãã ããšãã°ã zip
ãŸãã¯groupBy
ã ãããã£ãŠãã¿ãã«ã䜿çšããå Žåã¯ãäžè¬åãããã¢ã«ãŽãªãºã ãèšè¿°ãããšãã«ã®ã¿äœ¿çšããŠãã ããã ä»ã®ãã¹ãŠã®ã±ãŒã¹ã§ã¯ãå€ãè¯ãcase class
ããããšããå§ãããŸãã
äžç·ã«ã€ããŠ
Scalaã§_
䜿çšãããŠãããã¹ãŠã®ã±ãŒã¹ããªã¹ãã§ããŸããïŒ èª¿æ»ã«ãããšããããè¡ãããšãã§ããScalaéçºè
ã¯ããã7ïŒ
ã§ãã ã¢ã³ããŒã¹ã³ã¢ã¯ãèšèªã§äœåºŠãããŸããŸãªã³ã³ããã¹ãã§äœ¿çšãããŸãã ããã¯ããã§ãã説æãããŠããŸãã ã»ãšãã©ã®å Žåãã¢ã³ããŒã¹ã³ã¢ãªãã§å®è¡ããããšã¯ã§ããŸãããæ§æã§ã¯ãè€æ°ã®ã€ã³ããŒããŸãã¯äŸå€ã®ããã€ã³ããŒãã«å¯ŸããŠã¢ã³ããŒã¹ã³ã¢ãå¿
èŠã§ãã ä»ã«ãåççãªçšéããããŸãïŒãããããªããŠã䜿çšã§ããŸãïŒã ãã ããã©ã ãåŒå
ã§èªã¿ãããã¯è¿œå ãããŸããã ã¢ã³ããŒã¹ã³ã¢ã3ã€ä»¥äžãããšãã©ã ãã®èªã¿åããå°é£ã«ãªããŸãã
ãµã³ãã«ãšæ¯èŒãããšã圌ãã¯ããªãã®äººçãå°ç¡ãã«ããããšãã§ããŸãã Fork
ãšLeaf
ç解ããŸãã
def weight(tree: CodeTree): Int = tree match { case Fork(_, _, _, weight) => weight case Leaf(_, weight) => weight }
ããã§ïŒ
def weight(tree: CodeTree): Int = tree match { case Fork(left, right, chars, weight) => weight case Leaf(char, weight) => weight }
ãæ°ã¥ããããããŸãããããããã®å€ã¯äœ¿çšãããŸããã ããããã¢ã³ããŒã¹ã³ã¢ã§äžæžãããå¿
èŠãããå Žåã¯ããã§ã¯ãããŸããã ç§ãä¿¡ããŠãããã°ã©ãã³ã°ã®é床ã¯ã¿ã€ãã³ã°ã®é床ã«äŸåããŸãããèªã¿ãããããããã«ãããã€ãã®äœåãªæåãæžãããšãã§ããŸãã
çµè«ãšããŠ
ãã®èšäºã§ã¯ãScalaã®äž»èŠãªæ©èœã€ãã£ãªã ã«ã€ããŠèª¬æããä»ã®æ©èœèšèªãšå€ãã®é¡äŒŒç¹ãåŒãåºãããšè©Šã¿ãŸããïŒãããŠãå€æããã®ã§ã¯ãªããå€æãããã©ããïŒã 次ã®éšåã§ã¯ãOOPãšã³ã¬ã¯ã·ã§ã³ã«é¢é£ããã€ãã£ãªã ã«ã€ããŠèª¬æããå€ãã®åå¿è
éçºè
ãæ©ãŸããŠããã€ã³ãã©ã¹ãã©ã¯ãã£ã®åé¡ã«é¢ããç§ã®èããè¿°ã¹ãŸãã ããªãããã®èšäºã楜ããã ããšãæ¬åœã«é¡ã£ãŠããŸãã èŸæ±åŒ·ãæåŸãŸã§èªãã§ãããŠããããšãã ç¶ç¶ããã