64
Java プログラマ捧げる Scala入門 Seasar Conference 2009 Autumn 2009912日土曜日

20090911 Seasar Conference2009 Autumn

Embed Size (px)

DESCRIPTION

Seasar Conference2009 Autumn Javaプログラマに捧げるScala入門

Citation preview

Page 1: 20090911 Seasar Conference2009 Autumn

Javaプログラマに

捧げる

Scala入門Seasar Conference 2009 Autumn

2009年9月12日土曜日

Page 2: 20090911 Seasar Conference2009 Autumn

自己紹介

ID:yuroyoroゆろよろ

2009年9月12日土曜日

Page 3: 20090911 Seasar Conference2009 Autumn

自己紹介

• 尾崎 智仁(ゆろよろ)

• ID:yuroyoro(はてな、twitter、wassr)

• フリーエンジニア

• JavaとかScalaとかpythonとか

2009年9月12日土曜日

Page 4: 20090911 Seasar Conference2009 Autumn

好きなキャラに脳内で変換して

聞いてください・・・

2009年9月12日土曜日

Page 5: 20090911 Seasar Conference2009 Autumn

それでは・・・

2009年9月12日土曜日

Page 6: 20090911 Seasar Conference2009 Autumn

質問たーいむ!!

2009年9月12日土曜日

Page 7: 20090911 Seasar Conference2009 Autumn

Q.Scala本読みました?

2009年9月12日土曜日

Page 8: 20090911 Seasar Conference2009 Autumn

今日の内容

•scalaの紹介!

•デモ2連発っ!

•言語仕様弾丸ツアー!

•まとめっ!2009年9月12日土曜日

Page 9: 20090911 Seasar Conference2009 Autumn

scalaの紹介!

2009年9月12日土曜日

Page 10: 20090911 Seasar Conference2009 Autumn

Q.scalaってなに?

2009年9月12日土曜日

Page 11: 20090911 Seasar Conference2009 Autumn

A.幼女です

(id: kumajet)2009年9月12日土曜日

Page 12: 20090911 Seasar Conference2009 Autumn

みんな大好きついったーもscalaで動いてます

2009年9月12日土曜日

Page 13: 20090911 Seasar Conference2009 Autumn

すからたんが“変態Post”を

処理してると思うと萌えますね?

2009年9月12日土曜日

Page 14: 20090911 Seasar Conference2009 Autumn

• jvmで動きます!

•オブジェクト指向 + 関数型

•ファーストクラス関数

•静的型付け + 型推論

•Javaとの相互運用

scalaの特徴

2009年9月12日土曜日

Page 15: 20090911 Seasar Conference2009 Autumn

•インタプリタで動作確認が

できる!

•型推論で簡潔なコード

•でも静的型付け言語

scalaの気持ちいいところ

2009年9月12日土曜日

Page 16: 20090911 Seasar Conference2009 Autumn

•クロージャ + 充実したコレ

クションライブラリ

•Object,traitで進化したオ

ブジェクト指向

scalaの気持ちいいところ

2009年9月12日土曜日

Page 17: 20090911 Seasar Conference2009 Autumn

case class UserTimeline( maxId:Long )

object UserTimelineActor extends Actor{ import Main._

def act = { var cnt:Long = 0 loop{ react{ case UserTimeline( maxId ) => getUserTimeline( maxId ) match { case (xml:Node , nextMaxId:Long ) => outputter.add( xml ) cnt += 200 Thread.sleep(interval) this ! UserTimeline( nextMaxId - 1) case _ => outputter.close exit } } }

scalaのソース(例)

2009年9月12日土曜日

Page 18: 20090911 Seasar Conference2009 Autumn

2009年9月12日土曜日

Page 19: 20090911 Seasar Conference2009 Autumn

ちょwwwイwwミwwフwwwなにwwwこれww

2009年9月12日土曜日

Page 20: 20090911 Seasar Conference2009 Autumn

Scalaは業務では使えない?

2009年9月12日土曜日

Page 21: 20090911 Seasar Conference2009 Autumn

No!!2009年9月12日土曜日

Page 22: 20090911 Seasar Conference2009 Autumn

今から実証

してやんよ!

2009年9月12日土曜日

Page 23: 20090911 Seasar Conference2009 Autumn

デモっ!

2009年9月12日土曜日

Page 24: 20090911 Seasar Conference2009 Autumn

demo その1

•scalaで簡単なスクリプトを書いてみる!

•twitter検索でs2conのハッシュタグを検索

•目標5分!

2009年9月12日土曜日

Page 25: 20090911 Seasar Conference2009 Autumn

demo その2

•S2Console!•Seasarプロダクトをインタプリタで動作確認

•LLフレームワークの対話環境をJavaにも!

2009年9月12日土曜日

Page 26: 20090911 Seasar Conference2009 Autumn

Scala言語仕様弾丸ツアー!

2009年9月12日土曜日

Page 27: 20090911 Seasar Conference2009 Autumn

インタプリタで動作を

確認してみよう!

2009年9月12日土曜日

Page 28: 20090911 Seasar Conference2009 Autumn

基本編

2009年9月12日土曜日

Page 29: 20090911 Seasar Conference2009 Autumn

変数(var,val)

• var/valで変数を宣言• var 変数名:型 = 値• varは変更可能、valは変更不可(final)

2009年9月12日土曜日

Page 30: 20090911 Seasar Conference2009 Autumn

変数(var,val)

scala> val i:Int = 1i: Int = 1scala> i = 2<console>:13: error: reassignment to val i = 2 ^scala> var j = 10j: Int = 10scala> j = 20j: Int = 20

varは代入可能

valは再代入できない変数(javaのfinal)

代入しようとするとエラー

2009年9月12日土曜日

Page 31: 20090911 Seasar Conference2009 Autumn

型推論

•変数、関数の戻り値は省略可能

•コンパイラーが推論する•型パラメータも含めて推論•関数の引数は省略できない

2009年9月12日土曜日

Page 32: 20090911 Seasar Conference2009 Autumn

scala> val list:List[Int] = List(1,2,3,4)

list: List[Int] = List(1, 2, 3, 4)

scala> val list = List(1,2,3,4)

list: List[Int] = List(1, 2, 3, 4)

scala> val a = List(1,2,3).map( _.toString )(0)

a: java.lang.String = 1

省略!

省略できる

関数の戻り値から推論!

型推論

2009年9月12日土曜日

Page 33: 20090911 Seasar Conference2009 Autumn

if文

• if/else文は値を返す• ifの条件はBoolean• elseが無い場合は値を返さない(Unit型が結果となる)

• if文の結果を変数に代入できる(三項演算子的な)

2009年9月12日土曜日

Page 34: 20090911 Seasar Conference2009 Autumn

scala> val s = "abcdef"s: java.lang.String = abcdef

scala> if( s.startsWith("abc") ) s.length else 0res4: Int = 6

scala> val r = if(s.length > 1) s.substring(1) else ""r: java.lang.String = bcdef

Int型が返る

条件は(Boolean)

if文

結果を代入!

2009年9月12日土曜日

Page 35: 20090911 Seasar Conference2009 Autumn

for式によるループ

• for式でコレクションの反復処理(javaの拡張forに相当)

• for( 変数 <- コレクション) { ... }• コレクション生成 - for( 変数 <- コレクション) yield { ... }

• フィルター - for ( n <- 1 to 10 ; if n % 2 == 0) yield { ... }

• break/continueはない! (2.8で実装)2009年9月12日土曜日

Page 36: 20090911 Seasar Conference2009 Autumn

scala> for( n <- 1 to 10 if n %2 == 0 ){ print(n * 2 + ",") }4,8,12,16,20,

scala> val g = for( s <- List("a","b","c"); l = s.length )yield { s + ":" + l }g: List[java.lang.String] = List(a:1, b:1, c:1)

1から10のなかで偶数のみ

for式によるループ

結果を代入!

2009年9月12日土曜日

Page 37: 20090911 Seasar Conference2009 Autumn

関数編

2009年9月12日土曜日

Page 38: 20090911 Seasar Conference2009 Autumn

関数

def countChar ( s:String, c:Char ) : Int = {

var cnt:Int = 0

for( ct <- st if ct == c) {

cnt += 1

}

cnt

}

戻り値の型

関数名

引数仮引数:型

defで関数定義

最後に評価された値が戻り値

2009年9月12日土曜日

Page 39: 20090911 Seasar Conference2009 Autumn

• def 関数名( 引数 ): 結果型 = { ... }• val f = 関数名 _ で関数オブジェクト• 関数リテラル - 無名関数的な

関数

val f = (x:Int,y:Int) => { x + y }

• 関数リテラルでは _ で引数のプレースホルダ

引数仮引数:型

本体

2009年9月12日土曜日

Page 40: 20090911 Seasar Conference2009 Autumn

scala> def isEven(i:Int):Boolean = { return ( i % 2 == 0 ) } isEven: (Int)Boolean

scala> def isEven(i:Int) = i % 2 == 0isEven: (Int)Boolean

scala> val func = isEven _func: (Int) => Boolean = <function>

scala> val f = (i:Int) => i % 2 == 0f: (Int) => Boolean = <function>

省略!

Javaっぽく書くとこんな感じ

関数をオブジェクトとして変数に

代入!

関数リテラル!

関数

2009年9月12日土曜日

Page 41: 20090911 Seasar Conference2009 Autumn

カリー化と部分適用

• def hoge(i:Int)(j:Int) = i + j•引数を()で分けるとカリー化• hoge( 1 )(_:Int)•引数に_を指定して関数を部分適用

2009年9月12日土曜日

Page 42: 20090911 Seasar Conference2009 Autumn

scala> def add(n:Int)(m:Int)=n+madd: (n: Int)(m: Int)Int

scala> val add3 = add( 3 ) _add3: (Int) => Int = <function>

scala> def curryingAdd( n:Int ) = add( n ) _curryingAdd: (Int)(Int) => Int

カリー化っ!!

カリー化された”関数”を返す関数

カリー化と部分適用

“_”で部分適用!

2009年9月12日土曜日

Page 43: 20090911 Seasar Conference2009 Autumn

ネスト関数とクロージャ

•関数は入れ子(ネスト)にできる!

•関数の外側の変数(自由変数)を参照できる

•自由変数への参照を実行時に取り込む (クロージャ )

2009年9月12日土曜日

Page 44: 20090911 Seasar Conference2009 Autumn

def outer ( i:Int, s:String ) = {

val v:String = s + ":" + i

def inner( p:String ) = p + v

inner _

}

入れ子の関数から外側の変数

を参照

自由変数Vを取り込んだinner関数オブジェクト

を返す

ネスト関数とクロージャ

scala> val inf = outer( 5, "hoge" )inf: (String) => java.lang.String = <function>scala> inf("foo - ")res2: java.lang.String = foo - hoge:5

2009年9月12日土曜日

Page 45: 20090911 Seasar Conference2009 Autumn

• scalaのコレクションは引数に関数を取るものが多い

• map,filter,foreach,exist ...•柔軟なコレクションの操作• List,Map,Setなど

コレクションに関数を

2009年9月12日土曜日

Page 46: 20090911 Seasar Conference2009 Autumn

scala> val list = List(1,2,3,4)res1: List[Int] = List(1, 2, 3, 4)

scala> list.map( {(n:Int) => n * 2} )res2: List[Int] = List(2, 4, 6, 8)

scala> list.filter( _ % 2 == 0 )res3: List[Int] = List(2, 4)

scala> list.filter( func ) res4: List[Int] = List(2, 4)

偶数の要素を抽出

map操作関数リテラルで各要素を2倍

関数オブジェクトを引数に渡す!

コレクションに関数を

2009年9月12日土曜日

Page 47: 20090911 Seasar Conference2009 Autumn

クラス編

2009年9月12日土曜日

Page 48: 20090911 Seasar Conference2009 Autumn

• class <クラス名>(コンストラクタ引数)• objectでシングルトン定義• ネスト classの中にclassやobject• staticがないscalaでは、コンパニオンオブジェクトを利用する

• 同一スコープに同じ名前のclassとobjectがあると特権的な アクセス権

ObjectFoo

classFoo

privateへのアクセス

クラスとオブジェクト

2009年9月12日土曜日

Page 49: 20090911 Seasar Conference2009 Autumn

クラスとオブジェクト

class Foo ( s:String, i:Int ) {

val p1:String = s

var p2:Int = i

private var p3 = 1

def hoge = s * p3

}

object Foo {

val aaa ="aaa"

def setP3( foo:Foo, i:Int) = foo.p3 = i

}

フィールドvalは変更不可varは変更化

クラス名コンストラクタ引数

classでclass定義

関数objectでSingletonobject 同一クラス名の

クラスのprivateフィールドにアクセスできる

2009年9月12日土曜日

Page 50: 20090911 Seasar Conference2009 Autumn

• trait は実装をもてるinterface• classやobjectに複数のtraitをMix-In• trait の中で実装を持たないメンバはabstract

traitとmixin

classFoo

traitBar

traitBaz

BarとBazから実装を

継承

2009年9月12日土曜日

Page 51: 20090911 Seasar Conference2009 Autumn

traitとmixin

trait Bar {

val bs:String = "Bar"

def bar( n:Int ) = bs * n

}

trait Baz { def baz( n:Int ) = "Baz" * n }

class Foo extends Bar with Baz

traitはフィールド関数をもてる

trait名traitでtrait定義

withで複数のtraitをmixin

2009年9月12日土曜日

Page 52: 20090911 Seasar Conference2009 Autumn

• case class <クラス名>(コンストラクタ引数)

• case class は名前(...)でインスタンス生成( immutable object)

• case クラスはパターンとして使える• matchはswitchの強力なやつ• 値 match { case パターン => 処理 ...}• パターン には、値/型/caseクラスを指定

caseクラスとパターンマッチ

2009年9月12日土曜日

Page 53: 20090911 Seasar Conference2009 Autumn

abstract class Pt

case class CC(s:String) extends Pt

case class DD(i:Int ,s:String) extends Pt

def test(p:Pt) = p match {

case CC( s ) => println( s )

case DD( 3 ,_) => println(“match DD”)

}

case class定義

抽象クラス

matchしたcase classの値を利用

caseクラスとパターンマッチ

case classをパターンとして

match

2009年9月12日土曜日

Page 54: 20090911 Seasar Conference2009 Autumn

他にも変態的な言語仕様が盛りだくさん

ExtractorImplicit conversion

Structural typing

Lazy value

Partial Function

XMLリテラル

Implicitparameter

Existential type

Specialized annotation

2009年9月12日土曜日

Page 55: 20090911 Seasar Conference2009 Autumn

• implicit conversion - 暗黙の型変換( StringからDoubleに自動変換etc)

• implict parameter- 型による自動判別を行うデフォルト引数

• structual typing- type safeなダックタイピング

• lazy value- 遅延評価

ちょっとだけよ・・・

2009年9月12日土曜日

Page 56: 20090911 Seasar Conference2009 Autumn

• XMLリテラル- xmlをリテラルで評価

• 共変/反変なGenerics- Array[String]はArray[Any]のサブクラス

• actorライブラリ- mesage base非同期処理

• Lift web framework- 関数型webフレームワーク

ちょっとだけよ・・・

2009年9月12日土曜日

Page 57: 20090911 Seasar Conference2009 Autumn

まとめっ!

2009年9月12日土曜日

Page 58: 20090911 Seasar Conference2009 Autumn

フリーダムすぐる

言語仕様を楽しめ!!

2009年9月12日土曜日

Page 59: 20090911 Seasar Conference2009 Autumn

JavaとLLの融合!!

2009年9月12日土曜日

Page 60: 20090911 Seasar Conference2009 Autumn

進化したオブジェクト指向でJavaの常識を破壊せよ!!

2009年9月12日土曜日

Page 61: 20090911 Seasar Conference2009 Autumn

関数型言語の概念を加えた次世代の

プログラミングパラダイム!!

2009年9月12日土曜日

Page 62: 20090911 Seasar Conference2009 Autumn

情報源

•公式サイトhttp://www.scala-lang.org/

• Scala 東北https://sites.google.com/site/scalatohoku/

• Scala-behttp://groups.google.co.jp/group/scala-be

•Programming in Scalahttp://www.amazon.co.jp/Programming-Scala-Comprehensive-Step-step/dp/0981531601

2009年9月12日土曜日

Page 63: 20090911 Seasar Conference2009 Autumn

Have fun with

Scala !!

2009年9月12日土曜日

Page 64: 20090911 Seasar Conference2009 Autumn

ご清聴ありがとうございました!

2009年9月12日土曜日