20121222 scalaビギナーズ

48
Scalaやろうぜ! by Abe Asami 121227日木曜日

Upload: asami-abe

Post on 31-May-2015

1.976 views

Category:

Technology


0 download

DESCRIPTION

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

TRANSCRIPT

Page 1: 20121222 scalaビギナーズ

Scalaやろうぜ!by Abe Asami

12年12月27日木曜日

Page 2: 20121222 scalaビギナーズ

自己紹介

Abe Asami “きの子” (フリーエンジニア)http://nocono.net/Twitter: @aa7th

使用言語:Java、C#など

12年12月27日木曜日

Page 3: 20121222 scalaビギナーズ

先日こんな発表をしてきました

12年12月27日木曜日

Page 4: 20121222 scalaビギナーズ

http://nocono.net/12

2012/11/24(土) 第2回 関数型言語勉強会 大阪にて

12年12月27日木曜日

Page 5: 20121222 scalaビギナーズ

その後

12年12月27日木曜日

Page 6: 20121222 scalaビギナーズ

あんまりはかどっていません

12年12月27日木曜日

Page 7: 20121222 scalaビギナーズ

また2日前から焦ってちょっと頑張りました

12年12月27日木曜日

Page 8: 20121222 scalaビギナーズ

初心者による初心者のためのScala講座はじまりはじまり

というわけで・・・

12年12月27日木曜日

Page 9: 20121222 scalaビギナーズ

Scalaって何?JVM言語

オブジェクト指向であり関数型

ポストJavaとして注目されている

12年12月27日木曜日

Page 10: 20121222 scalaビギナーズ

メリットJavaと比較して簡潔に記述できる (コード量が1/2~1/3は減る)静的型付け、事前コンパイルJavaライブラリ利用可能並行処理に強い

12年12月27日木曜日

Page 11: 20121222 scalaビギナーズ

メリットJavaと比較して簡潔に記述できる (コード量が1/2~1/3は減る)静的型付け、事前コンパイルJavaライブラリ利用可能並行処理に強い

スケーラビリティが高い12年12月27日木曜日

Page 12: 20121222 scalaビギナーズ

デメリットコンパイルが遅いエンジニアが少ない関数型についての学習コストが高い

12年12月27日木曜日

Page 13: 20121222 scalaビギナーズ

関数型って?関数を値(リテラル)として扱う言語

「副作用」を極力避けるコンピュータの論理的な状態を変化させない!

数学的な関数のこと

変数への代入を避けて定数を使用する

イミュータブル

12年12月27日木曜日

Page 14: 20121222 scalaビギナーズ

副作用がないと...

変数に想定外の値がはいっていた!というような事態がない並行処理がこわくなくなる

12年12月27日木曜日

Page 15: 20121222 scalaビギナーズ

副作用がないと...

変数に想定外の値がはいっていた!というような事態がない並行処理がこわくなくなる

バグが減少する

12年12月27日木曜日

Page 16: 20121222 scalaビギナーズ

とりあえずはじめてみましょう

12年12月27日木曜日

Page 17: 20121222 scalaビギナーズ

インストールhttp://www.scala-lang.org/downloads

もしくはHomebrewでbrew install scala

12年12月27日木曜日

Page 18: 20121222 scalaビギナーズ

REPLで実行

$scala

12年12月27日木曜日

Page 19: 20121222 scalaビギナーズ

REPLで実行

scala> val num = 5num: Int = 5

12年12月27日木曜日

Page 20: 20121222 scalaビギナーズ

変数と定数scala> val num = 5num: Int = 5

val = 定数var = 変数

12年12月27日木曜日

Page 21: 20121222 scalaビギナーズ

型推論scala> val num = 5num: Int = 5

型宣言しなくていい!

12年12月27日木曜日

Page 22: 20121222 scalaビギナーズ

基本型scala> val num = 5num: Int = 5

Intクラス型コンパイル時にintに変換される

12年12月27日木曜日

Page 23: 20121222 scalaビギナーズ

セミコロン推論scala> val num = 5num: Int = 5

セミコロンを省略できる

12年12月27日木曜日

Page 24: 20121222 scalaビギナーズ

次のJavaプログラムを初心者なりにScalaで書き換えてみました

12年12月27日木曜日

Page 25: 20121222 scalaビギナーズ

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); }}

Java

12年12月27日木曜日

Page 26: 20121222 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) }}

Scala

12年12月27日木曜日

Page 27: 20121222 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) }}

Scalaシングルトンクラス

コレクション(Range)

12年12月27日木曜日

Page 28: 20121222 scalaビギナーズ

まだ短くなる筈だ!

12年12月27日木曜日

Page 29: 20121222 scalaビギナーズ

var sum = 0 for (num <- start to end) sum += num

val sum = (0 /: (start to end)) (_+_)

12年12月27日木曜日

Page 30: 20121222 scalaビギナーズ

順を追って説明します

12年12月27日木曜日

Page 31: 20121222 scalaビギナーズ

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日木曜日

Page 32: 20121222 scalaビギナーズ

def add(x:Int, y:Int) = x + yval sum = (start to end).foldLeft(0)(add)

def add(x:Int, y:Int) : Int = {x + y}val sum = (start to end).foldLeft(0)(add)

戻り値の型省略 1行なので中括弧省略

・等号を省略すると戻り値無しとみなされる・戻り値型の省略はほどほどに (分かりにくくなるかも)

12年12月27日木曜日

Page 33: 20121222 scalaビギナーズ

def add(x:Int, y:Int) = x + yval sum = (start to end).foldLeft(0)(add)

val sum = (start to end).foldLeft(0)((x, y) => x + y)

無名関数

12年12月27日木曜日

Page 34: 20121222 scalaビギナーズ

val sum = (start to end).foldLeft(0)((x, y) => x + y)

val sum = (start to end).foldLeft(0)(_+_)

プレースホルダー

※引数が1回しか使われない場合のみ

12年12月27日木曜日

Page 35: 20121222 scalaビギナーズ

val sum = (start to end).foldLeft(0)(_+_)

val sum = (start to end)./:(0)(_+_)

foldLeftの別名

12年12月27日木曜日

Page 36: 20121222 scalaビギナーズ

val sum = (0 /: (start to end)) (_+_)

val sum = (start to end)./:(0)(_+_)

演算子記法

12年12月27日木曜日

Page 37: 20121222 scalaビギナーズ

最終的にこうなりました

12年12月27日木曜日

Page 38: 20121222 scalaビギナーズ

object Sum { def main(args: Array[String]) { println((0 /: (args(0).toInt to args(1).toInt)) (_+_)) }}

Scala(最終版)

追記:ここまでやると可読性が下がるので、   程々のところで止めておくのがよいとのことです。   というか、リストの合計を出すsum関数があるので、実際は   (args(0).toInt to args(1).toInt).sum   でOK!

12年12月27日木曜日

Page 39: 20121222 scalaビギナーズ

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); }}

object Sum { def main(args: Array[String]) { println((0 /: (args(0).toInt to args(1).toInt)) (_+_)) }}

Before After

12年12月27日木曜日

Page 40: 20121222 scalaビギナーズ

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); }}

object Sum { def main(args: Array[String]) { println((0 /: (args(0).toInt to args(1).toInt)) (_+_)) }}

Before After

/ ドヤァ...\

12年12月27日木曜日

Page 41: 20121222 scalaビギナーズ

どうやらリスト操作を覚えると割と簡単に関数型ちっくな書き方が

できるようです

12年12月27日木曜日

Page 42: 20121222 scalaビギナーズ

リスト操作についてはこの後@mumoshuさんのセッションにて!

12年12月27日木曜日

Page 43: 20121222 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日木曜日

Page 44: 20121222 scalaビギナーズ

無理せず楽しく慣れていきましょ!

12年12月27日木曜日

Page 45: 20121222 scalaビギナーズ

おすすめ書籍

通称:コップ本

12年12月27日木曜日

Page 46: 20121222 scalaビギナーズ

お役立ちサイトhttps://www.coursera.org/

「Coursera」(英語)

http://www.ne.jp/asahi/hishidama/home/tech/scala/index.html

「Hishidama’s Scala Memo」

「Scala Cookbook」http://www.ne.jp/asahi/hishidama/home/tech/scala/index.html

12年12月27日木曜日

Page 47: 20121222 scalaビギナーズ

お役立ちサイトhttp://itpro.nikkeibp.co.jp/article/COLUMN/20080613/308019/

「刺激を求める技術者に捧げるScala講座(ITPro)」

「Scala入門(@IT)」http://www.atmarkit.co.jp/fjava/index/index_scala.html

12年12月27日木曜日

Page 48: 20121222 scalaビギナーズ

ご清聴ありがとうございましたm(_ _)m

12年12月27日木曜日