20121222 scalaビギナーズ
DESCRIPTION
2012/12/22(土) 第1回 Scalaビギナーズでの発表資料ですTRANSCRIPT
Scalaやろうぜ!by Abe Asami
12年12月27日木曜日
自己紹介
Abe Asami “きの子” (フリーエンジニア)http://nocono.net/Twitter: @aa7th
使用言語:Java、C#など
12年12月27日木曜日
先日こんな発表をしてきました
12年12月27日木曜日
http://nocono.net/12
2012/11/24(土) 第2回 関数型言語勉強会 大阪にて
12年12月27日木曜日
その後
12年12月27日木曜日
あんまりはかどっていません
12年12月27日木曜日
また2日前から焦ってちょっと頑張りました
12年12月27日木曜日
初心者による初心者のためのScala講座はじまりはじまり
というわけで・・・
12年12月27日木曜日
Scalaって何?JVM言語
オブジェクト指向であり関数型
ポストJavaとして注目されている
12年12月27日木曜日
メリットJavaと比較して簡潔に記述できる (コード量が1/2~1/3は減る)静的型付け、事前コンパイルJavaライブラリ利用可能並行処理に強い
12年12月27日木曜日
メリットJavaと比較して簡潔に記述できる (コード量が1/2~1/3は減る)静的型付け、事前コンパイルJavaライブラリ利用可能並行処理に強い
スケーラビリティが高い12年12月27日木曜日
デメリットコンパイルが遅いエンジニアが少ない関数型についての学習コストが高い
12年12月27日木曜日
関数型って?関数を値(リテラル)として扱う言語
「副作用」を極力避けるコンピュータの論理的な状態を変化させない!
数学的な関数のこと
変数への代入を避けて定数を使用する
イミュータブル
12年12月27日木曜日
副作用がないと...
変数に想定外の値がはいっていた!というような事態がない並行処理がこわくなくなる
12年12月27日木曜日
副作用がないと...
変数に想定外の値がはいっていた!というような事態がない並行処理がこわくなくなる
バグが減少する
12年12月27日木曜日
とりあえずはじめてみましょう
12年12月27日木曜日
インストールhttp://www.scala-lang.org/downloads
もしくはHomebrewでbrew install scala
12年12月27日木曜日
REPLで実行
$scala
12年12月27日木曜日
REPLで実行
scala> val num = 5num: Int = 5
12年12月27日木曜日
変数と定数scala> val num = 5num: Int = 5
val = 定数var = 変数
12年12月27日木曜日
型推論scala> val num = 5num: Int = 5
型宣言しなくていい!
12年12月27日木曜日
基本型scala> val num = 5num: Int = 5
Intクラス型コンパイル時にintに変換される
12年12月27日木曜日
セミコロン推論scala> val num = 5num: Int = 5
セミコロンを省略できる
12年12月27日木曜日
次のJavaプログラムを初心者なりにScalaで書き換えてみました
12年12月27日木曜日
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日木曜日
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日木曜日
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日木曜日
まだ短くなる筈だ!
12年12月27日木曜日
var sum = 0 for (num <- start to end) sum += num
val sum = (0 /: (start to end)) (_+_)
12年12月27日木曜日
順を追って説明します
12年12月27日木曜日
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日木曜日
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日木曜日
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日木曜日
val sum = (start to end).foldLeft(0)((x, y) => x + y)
val sum = (start to end).foldLeft(0)(_+_)
プレースホルダー
※引数が1回しか使われない場合のみ
12年12月27日木曜日
val sum = (start to end).foldLeft(0)(_+_)
val sum = (start to end)./:(0)(_+_)
foldLeftの別名
12年12月27日木曜日
val sum = (0 /: (start to end)) (_+_)
val sum = (start to end)./:(0)(_+_)
演算子記法
12年12月27日木曜日
最終的にこうなりました
12年12月27日木曜日
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日木曜日
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日木曜日
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日木曜日
どうやらリスト操作を覚えると割と簡単に関数型ちっくな書き方が
できるようです
12年12月27日木曜日
リスト操作についてはこの後@mumoshuさんのセッションにて!
12年12月27日木曜日
慣れないうちはこの書き方でも良いと思います
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日木曜日
無理せず楽しく慣れていきましょ!
12年12月27日木曜日
おすすめ書籍
通称:コップ本
12年12月27日木曜日
お役立ちサイト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日木曜日
お役立ちサイト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日木曜日
ご清聴ありがとうございましたm(_ _)m
12年12月27日木曜日