20121222 scalaビギナーズ

2,116
-1

Published on

2012/12/22(土) 第1回 Scalaビギナーズでの発表資料です

Published in: Technology
1 Comment
1 Like
Statistics
Notes
No Downloads
Views
Total Views
2,116
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
7
Comments
1
Likes
1
Embeds 0
No embeds

No notes for slide

20121222 scalaビギナーズ

  1. 1. Scalaやろうぜ! by Abe Asami12年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/1212年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 scala12年12月27日木曜日
  18. 18. REPLで実行 $scala12年12月27日木曜日
  19. 19. REPLで実行 scala> val num = 5 num: Int = 512年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.html12年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.html12年12月27日木曜日
  48. 48. ご清聴ありがとうございましたm(_ _)m12年12月27日木曜日
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×