Successfully reported this slideshow.
Your SlideShare is downloading. ×

20121222 scalaビギナーズ

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad

Check these out next

1 of 48 Ad
Advertisement

More Related Content

Viewers also liked (20)

Advertisement

Recently uploaded (20)

20121222 scalaビギナーズ

  1. 1. Scalaやろうぜ! by Abe Asami 12年12月27日木曜日
  2. 2. 自己紹介 Abe Asami きの子 (フリーエンジニア) http://nocono.net/ Twitter: @aa7th 使用言語:Java、C#など 12年12月27日木曜日
  3. 3. 先日こんな発表をしてきました 12年12月27日木曜日
  4. 4. 2012/11/24(土) 第2回 関数型言語勉強会 大阪にて http://nocono.net/12 12年12月27日木曜日
  5. 5. その後 12年12月27日木曜日
  6. 6. あんまりはかどっていません 12年12月27日木曜日
  7. 7. また2日前から焦ってちょっと 頑張りました 12年12月27日木曜日
  8. 8. というわけで・・・ 初心者による初心者のためのScala講座 はじまりはじまり 12年12月27日木曜日
  9. 9. Scalaって何? JVM言語 オブジェクト指向であり関数型 ポストJavaとして注目されている 12年12月27日木曜日
  10. 10. メリット Javaと比較して簡潔に記述できる (コード量が1/2∼1/3は減る) 静的型付け、事前コンパイル Javaライブラリ利用可能 並行処理に強い 12年12月27日木曜日
  11. 11. メリット Javaと比較して簡潔に記述できる (コード量が1/2∼1/3は減る) 静的型付け、事前コンパイル Javaライブラリ利用可能 並行処理に強い スケーラビリティが高い 12年12月27日木曜日
  12. 12. デメリット コンパイルが遅い エンジニアが少ない 関数型についての学習コスト が高い 12年12月27日木曜日
  13. 13. 関数型って? 関数を値(リテラル)として扱う言語 数学的な関数のこと 「副作用」を極力避ける コンピュータの論理的な状態を変化させない! 変数への代入を避けて定数を使用する イミュータブル 12年12月27日木曜日
  14. 14. 副作用がないと... 変数に想定外の値がはいっていた! というような事態がない 並行処理がこわくなくなる 12年12月27日木曜日
  15. 15. 副作用がないと... 変数に想定外の値がはいっていた! というような事態がない 並行処理がこわくなくなる バグが減少する 12年12月27日木曜日
  16. 16. とりあえずはじめてみましょう 12年12月27日木曜日
  17. 17. インストール http://www.scala-lang.org/downloads もしくはHomebrewで brew install scala 12年12月27日木曜日
  18. 18. REPLで実行 $scala 12年12月27日木曜日
  19. 19. REPLで実行 scala> val num = 5 num: Int = 5 12年12月27日木曜日
  20. 20. 変数と定数 scala> val num = 5 num: Int = 5 val = 定数 var = 変数 12年12月27日木曜日
  21. 21. 型推論 scala> val num = 5 num: Int = 5 型宣言しなくていい! 12年12月27日木曜日
  22. 22. 基本型 scala> val num = 5 num: Int = 5 Intクラス型 コンパイル時にintに変換される 12年12月27日木曜日
  23. 23. セミコロン推論 scala> val num = 5 num: Int = 5 セミコロンを省略できる 12年12月27日木曜日
  24. 24. 次のJavaプログラムを 初心者なりにScalaで書き換えてみました 12年12月27日木曜日
  25. 25. Java public class Sum { public static void main(String[] args) { int start = Integer.parseInt(args[0]); int end = Integer.parseInt(args[1]); int sum = 0; for (int num = start; num <= end; num++) sum += num; System.out.println(sum); } } 12年12月27日木曜日
  26. 26. Scala object Sum { def main(args: Array[String]) { val start = args(0).toInt val end = args(1).toInt var sum = 0 for (num <- start to end) sum += num println(sum) } } 12年12月27日木曜日
  27. 27. Scala シングルトンクラス object Sum { def main(args: Array[String]) { val start = args(0).toInt val end = args(1).toInt var sum = 0 for (num <- start to end) sum += num コレクション(Range) println(sum) } } 12年12月27日木曜日
  28. 28. まだ短くなる筈だ! 12年12月27日木曜日
  29. 29. var sum = 0 for (num <- start to end) sum += num val sum = (0 /: (start to end)) (_+_) 12年12月27日木曜日
  30. 30. 順を追って説明します 12年12月27日木曜日
  31. 31. var sum = 0 for (num <- start to end) sum += num def add(x:Int, y:Int) : Int = {x + y} val sum = (start to end).foldLeft(0)(add) 初期値 リストの各要素に対して ※引数が分割されている 行う処理 12年12月27日木曜日
  32. 32. def add(x:Int, y:Int) : Int = {x + y} val sum = (start to end).foldLeft(0)(add) 戻り値の型省略 1行なので 中括弧省略 def add(x:Int, y:Int) = x + y val sum = (start to end).foldLeft(0)(add) ・等号を省略すると戻り値無しとみなされる ・戻り値型の省略はほどほどに (分かりにくくなるかも) 12年12月27日木曜日
  33. 33. def add(x:Int, y:Int) = x + y val sum = (start to end).foldLeft(0)(add) 無名関数 val sum = (start to end).foldLeft(0)((x, y) => x + y) 12年12月27日木曜日
  34. 34. val sum = (start to end).foldLeft(0)((x, y) => x + y) プレースホルダー val sum = (start to end).foldLeft(0)(_+_) ※引数が1回しか使われない場合のみ 12年12月27日木曜日
  35. 35. val sum = (start to end).foldLeft(0)(_+_) foldLeftの別名 val sum = (start to end)./:(0)(_+_) 12年12月27日木曜日
  36. 36. val sum = (start to end)./:(0)(_+_) val sum = (0 /: (start to end)) (_+_) 演算子記法 12年12月27日木曜日
  37. 37. 最終的にこうなりました 12年12月27日木曜日
  38. 38. Scala(最終版) object Sum { def main(args: Array[String]) { println((0 /: (args(0).toInt to args(1).toInt)) (_+_)) } } 追記:ここまでやると可読性が下がるので、    程々のところで止めておくのがよいとのことです。    というか、リストの合計を出すsum関数があるので、実際は    (args(0).toInt to args(1).toInt).sum    でOK! 12年12月27日木曜日
  39. 39. Before After public class Sum { object Sum { public static void main(String[] args) { def main(args: Array[String]) { int start = Integer.parseInt(args[0]); println((0 /: (args(0).toInt to args(1).toInt)) (_+_)) int end = Integer.parseInt(args[1]); } } int sum = 0; for (int num = start; num <= end; num++) sum += num; System.out.println(sum); } } 12年12月27日木曜日
  40. 40. Before After public class Sum { object Sum { public static void main(String[] args) { def main(args: Array[String]) { int start = Integer.parseInt(args[0]); println((0 /: (args(0).toInt to args(1).toInt)) (_+_)) int end = Integer.parseInt(args[1]); } } int sum = 0; for (int num = start; num <= end; num++) sum += num; System.out.println(sum); } } / ドヤァ...\ 12年12月27日木曜日
  41. 41. どうやらリスト操作を覚えると 割と簡単に関数型ちっくな書き方が できるようです 12年12月27日木曜日
  42. 42. リスト操作については この後@mumoshuさんのセッションにて! 12年12月27日木曜日
  43. 43. 慣れないうちはこの書き方でも 良いと思います object Sum { def main(args: Array[String]) { val start = args(0).toInt val end = args(1).toInt var sum = 0 for (num <- start to end) sum += num println(sum) } } 12年12月27日木曜日
  44. 44. 無理せず楽しく慣れていきましょ! 12年12月27日木曜日
  45. 45. おすすめ書籍 通称:コップ本 12年12月27日木曜日
  46. 46. お役立ちサイト 「Coursera」(英語) https://www.coursera.org/ 「Hishidama s Scala Memo」 http://www.ne.jp/asahi/hishidama/home/tech/scala/index.html 「Scala Cookbook」 http://www.ne.jp/asahi/hishidama/home/tech/scala/index.html 12年12月27日木曜日
  47. 47. お役立ちサイト 「刺激を求める技術者に捧げるScala講座(ITPro)」 http://itpro.nikkeibp.co.jp/article/COLUMN/20080613/308019/ 「Scala入門(@IT)」 http://www.atmarkit.co.jp/fjava/index/index_scala.html 12年12月27日木曜日
  48. 48. ご清聴ありがとうございましたm(_ _)m 12年12月27日木曜日

×