å強帳 (2)
Scala By Example ãèªã¿ã¾ãã
è³æ: http://www.scala-lang.org/docu/files/ScalaByExample.pdf
1. Introduction
ããã¨ãã ãããã
2. A First Example
imperative ã«æ¸ããã¯ã¤ãã¯ã½ã¼ãã®ä¾ã
def sort(xs: Array[Int]) { def swap(i: Int, j: Int) { val t = xs(i); xs(i) = xs(j); xs(j) = t } def sort1(l: Int, r: Int) { val pivot = xs((l + r) / 2) var i = l; var j = r while (i <= j) { while (xs(i) < pivot) i += 1 while (xs(j) > pivot) j -= 1 if (i <= j) { swap(i, j) i += 1 j -= 1 } } if (l < j) sort1(l, j) if (j < r) sort1(i, r) } sort1(0, xs.length - 1) }
ã ãããè¦ãã¾ã¾ããã¤ã³ãã¯
- var 㯠mutable ãªå¤æ°ã®å®£è¨ãval 㯠immutable ãªå¤æ°ã®å®£è¨ã
- å±æé¢æ°ãå®ç¾©ã§ãããèªç±å¤æ°ã OK ãããã¯ãããªã
functional ã«æ¸ããã¯ã¤ãã¯ã½ã¼ãã®ä¾ã
def sort(xs: Array[Int]): Array[Int] = { if (xs.length <= 1) xs else { val pivot = xs(xs.length / 2) Array.concat( sort(xs filter (pivot >)), xs filter (pivot ==), sort(xs filter (pivot <))) } }
(pivot >) 㯠x => pivot > x ã®ç¥è¨ãHaskell ã¨åãããã ã (< pivot) ã¨ã¯æ¸ããªããä¾ã«ãã£ã¦ãè¨å·ãç¹å¥æ±ããã¦ãããããããªãããªã®ã§
val a = Array(1, 2, 3) (a concat)(a) // ArrayBufferRO(1, 2, 3, 1, 2, 3)
ã¨ãããã¨ãã§ããã
Scala 㯠while ãèªåã§å®ç¾©ã§ãããï¼ã®ä¾ã
def While (p: => Boolean) (s: => Unit) { if (p) { s; While(p)(s) } }
(p: => Boolean, s: => Unit) ã§ãªã (p: => Boolean) (s: => Unit) ãªã®ã¯ãã«ãªã¼åããé¢æ°ãå®ç¾©ããããã§ãããã
å¼æ°ã®åã Boolean ã§ãªã => Boolean ãªã¨ããããã¤ã³ããªãã ãããã©ãããã£ããããªããããªããããªã
ãã¨ãreturn ãã¼ã¯ã¼ãã¨ãã¡ã½ããæ¬ä½ã®åã« = ãã¤ããã¨ãã¤ããªãã¨ãæ¸ãã¦ãããã©ãããããããªãã
def foo { 1 } // foo: Unit def foo: Unit { 1 } // error: illegal start of declaration def foo: Int { 1 } // error: illegal start of declaration def foo = { 1 } // foo: Int def foo: Unit = { 1 } // foo: Unit def foo: Int = { 1 } // foo: Int def foo { return 1 } // foo: Unit def foo: Unit { return 1 } // error: illegal start of declaration def foo: Int { return 1 } // error: illegal start of declaration def foo = { return 1 } // error: method foo has return statement; needs result type def foo: Unit = { return 1 } // foo: Unit def foo: Int = { return 1 } // foo: Int
ãã¼ããé£ãããreturn 1 ãã¦ã () ã帰ããã¨ãããã¨ãä¸æ°å³ã
3. Programming with Actors and Messages
Actor ã使ã£ã¦ãªã¼ã¯ã·ã§ã³ãã·ãã¥ã¬ã¼ã·ã§ã³ãããããªæãã®ä¾ã
- ã¡ãã»ã¼ã¸ã種å¥ãã¨ã«ã±ã¼ã¹ã¯ã©ã¹ã§è¨è¨ãã¦ããã
- ã¡ãã»ã¼ã¸é信㯠client ! Status(maxBid, closing) ã¨ããä¾ã«ãã£ã¦ ! ã¯ãã ã®èå¥åããã®ææ³ã¯ä½¿ãåºããããªãã
ä»ã«é¢ç½ã話ã¯ãªãã£ãã
4. Expressions and Simple Functions
ããããææ³ãã¨ã«ãã©ã¼ã«ã¹ãå½ã¦ã¦ãã¾ãã¾ã¨èª¬æã
4.1. Expressions And Simple Functions
å®ç¾©ã¨å¤å®ç¾©ã®éãã
- å®ç¾© (def x = e) ã®ã¨ã㯠e ãè©ä¾¡ããªããx ã使ããããã³ã« e ãè©ä¾¡ãããã
- å¤å®ç¾© (val x = e) ã®ã¨ãã¯ããã« e ãè©ä¾¡ãããx 㯠e ã®è©ä¾¡çµæã«ç½®ãæãã (e ãåè©ä¾¡ããªã) ã
ãã¼ã
å¼ããå¤ã¸ã®æ®µéçãªç°¡ååãç°¡ç´ (reduction) ã¨ãããããã
4.2. Parameters
é¢æ°ã®ä»®å¼æ°ã«ã¯åæå®ãå¿ é ããã¼ããã¾ããããããªãã®ããªã
call-by-value 㨠call-by-name ã®è©±ãScala ã§ã¯ããã©ã«ã㧠call-by-value ã ãã©ãä»®å¼æ°ã®åã => ã§ã¯ãããã° call-by-name ã«ãªããã
def loop: Int = loop def first(x: Int, y: Int) = x first(1, loop) // ç¡éã«ã¼ã def first(x: Int, y: => Int) = x first(1, loop) // 1 ãè¿ã
ãã£ã²ãã¼ãé¢æ°ã使ã人 (= å¼ã³åºã人) ã«ã¯ãå®å¼æ°ãè©ä¾¡ããããã©ããããããã¨ãããç±ãã§ããã
4.3. Conditional Expressions
if-else ã¯å¤ãè¿ãããæ®éã®ãã¨ã
Scala ã®çå½å¤ã¯ true 㨠false ã! ã&& ã|| ã¯ãã¾ãæ®éã«åããã¨ãããã¨ã¯ ! ã ãã¯èå¥åãããªãã®ããªã
4.4. Example: Square Roots by Newton's Method
ã¹ã«ã¼ã
4.5. Nested Functions
ãã£ããåºã¦ããé¢æ°ã®ãã¹ãå®ç¾©ãã¨ãããå±æé¢æ°ã
é¢æ°åããã°ã©ãã³ã°ã®ã¹ã¿ã¤ã«ã§ã¯å°ãããã«ãé¢æ°ãããä½ããã ãã©ãåå空éãæ±ããã«é¢æ°ãä½ããã使ããå±æé¢æ°ã¯ã¨ã¦ã便å©ãRuby ã§ã§ããªãã®ãæ¯ããããRuby ã¯å¼ã³åºãå½¢å¼ã«ãã£ã¦ã¡ã½ãããé¢æ°ã¨è¦ç«ã¦ããã©ãã¤ã ãªã®ã§ãããããªããã ãã©ãScala ããã®ããããã©ããã¦ããã¯ã¾ã ããããªããã©ãããã¦ãªãã®ããªã
{ ... } ã¯ãããã¯ã§ããããã¯ã¯å¼ã®ä¸ç¨®ããããã¯ã®ä¸ã«å
¥ãã®ãæãå¼ãããããããªããã©ãå¼ã£ã½ããã¨ãæ¸ãã¦ããããã©å®éã«ã¯æã¿ããã®ãå
¥ã£ã¦ããã¨ãå¤ããã¨ããã¿ã¦ãRuby åæ§ã«æã¨å¼ã®åºå¥ã¯ãã¶ãææ§ãªãã ãããè¦ããã«ãRuby ã® ( ... ) ã¨åãã¨æãã°ãããããã{ ... } ã®ä¸ã®è£å©å®ç¾©ã¯ãã®ä¸ã ãã§è¦ããã
ãããã¯ã®ä¸ã®å®ç¾©ã®å¾ã«ã¯ã»ãã³ãã³ãå¿
é ããã ã以ä¸ã®ããããå ´åã«ã¯ãè¡ã®æå¾ã«åæã«ã»ãã³ãã³ãè£å®ãããã
- ãã®è¡ããå¼ã®çµããã«ãªããªãèªã§çµãã£ã¦ããå ´å (ããªãªãã¨ãä¸ç½®æ¼ç®åã¨ã)
- 次ã®è¡ããå¼ã®å§ãã«ãªããªãèªã§å§ã¾ã£ã¦ãå ´å
- () ã [] ã®ä¸ã®å ´å (ãããã®ä¸ã«ã¯è¤æ°ã®æãå ¥ãå¾ãªãã®ã§ãããã¨ã®ãã¨)
以ä¸ã¯å ¨é¨ leagl:
def f(x: Int) = x + 1; f(1) + f(2) def g1(x: Int) = x + 1 g(1) + g(2) def g2(x: Int) = {x + 1}; /* `;' å¿ é */ g2(1) + g2(2) def h1(x) = x + y h1(1) * h1(2) def h2(x: Int) = ( x // æ¬å¼§ããªãã¨ãã¡ + y // ã§ãªã㨠x ã®å¾ã«ã»ãã³ãã³ãæ¿å ¥ããã¡ãã ) h2(1) / h2(2)
ã¨ãããã¨ã§ãå®ç¾©ã®æ±ãããã¼ãããªããè¦ãã¦ããã
- def f = { 1 } ã® { ... } ã¯å¼ãã¾ã¨ãã¦ãã ããå®éãdef f = 1 ã¨æ¸ãã¦ããããdef ãå³è¾ºå¤ãããã«è©ä¾¡ããªãã®ã§ãé¢æ°å®ç¾©ã«ãªãã
- val f = { 1 } ã ã¨ããã«è©ä¾¡ãããã®ã§ãval f = { println("foo!"); 1 }; f; f ã¨ããã£ã¦ã foo! ã¯ä¸åããåºåãããªãã
- call-by-name ãªä»®å¼æ°ã使ããã¨ã§ãRuby ã®ãããã¯ã¿ãããªè¨è¿°ãã§ããï¼
def foo(f: => Unit) { f; f; f } foo({ println("foo!") }) // foo! ã 3 å表示 foo { println("foo!") } // åããæ¬å¼§ãçç¥ã§ããæ¡ä»¶ã¯ããã£ã¦ãªã
ã¾ããRuby ã®ãããã¯ã¿ãããªè¨è¿°ãã§ããã®ã¯çã£ã¦ãããã§ã¯ãªãããªããã®ãããã¯ã¯ä»®å¼æ°ãåããªããã
以ä¸ãé·ã
ã¨æ¸ãããã©å¤§ãããã¨ã¯è¨ã£ã¦ãªãã
4.6. Tail Recursion
æ«å°¾å帰ã¯é¤å»ããããã®è©±ããã ã Java VM ã®å¶éä¸ãå®ç§ã«ã¯é¤å»ã§ããªãã
Scala ã®ä»æ§ã¨ãã¦ã¯ãèªåèªèº«ã¸ç´æ¥å帰ããå ´åã¯æ«å°¾å帰é¤å»ãããã¨ãä¿è¨¼ãã¾ãã¨ã®ãã¨ãè£è¿ãã¨ãç¸äºå帰ã¯ä¿è¨¼ããªãããã¤ãã³ã¼ãã§ãåãã¡ã½ããå
ãªãã¸ã£ã³ãã§ãã¾ãããããã§ãããã¼ãã
ã¾ã¨ã
ãããã¯ã®é°å²æ°ãã¤ããããdef ã® = ã return ã®ãããã¯ãæ®éã¯ã©ãããæ¸ãæ¹ãããã¨çã£ã¦è¨è¨ããã¦ãã®ãã¾ã ããããããªãã
ããã«ãã¦ããããã¥ã¢ã«ãã¨ã¦ãããã§ãã¦ããã¨æããè±èªã¯é常ã«å¹³æã ãã説æãããããã¦ã³ãããªããããã ã¢ãããããªããèªã¿ç©ã¨ãã¦é¢ç½ãããã¡ãããè¨èªèªä½ããããããããããã ãã©ãä½è
èªèº«ããã®ããã¥ã¢ã«ãæ¸ãã¦ãã£ã¦ããã°ããããã¨ã§ããã
Scala By Example ã®ç¶ãã¯ã¾ãææ¥ã