Upload
tomohito-ozaki
View
2.008
Download
0
Embed Size (px)
DESCRIPTION
Seasar Conference2009 Autumn Javaプログラマに捧げるScala入門
Citation preview
Javaプログラマに
捧げる
Scala入門Seasar Conference 2009 Autumn
2009年9月12日土曜日
自己紹介
ID:yuroyoroゆろよろ
2009年9月12日土曜日
自己紹介
• 尾崎 智仁(ゆろよろ)
• ID:yuroyoro(はてな、twitter、wassr)
• フリーエンジニア
• JavaとかScalaとかpythonとか
2009年9月12日土曜日
好きなキャラに脳内で変換して
聞いてください・・・
2009年9月12日土曜日
それでは・・・
2009年9月12日土曜日
質問たーいむ!!
2009年9月12日土曜日
Q.Scala本読みました?
2009年9月12日土曜日
今日の内容
•scalaの紹介!
•デモ2連発っ!
•言語仕様弾丸ツアー!
•まとめっ!2009年9月12日土曜日
scalaの紹介!
2009年9月12日土曜日
Q.scalaってなに?
2009年9月12日土曜日
A.幼女です
(id: kumajet)2009年9月12日土曜日
みんな大好きついったーもscalaで動いてます
2009年9月12日土曜日
すからたんが“変態Post”を
処理してると思うと萌えますね?
2009年9月12日土曜日
• jvmで動きます!
•オブジェクト指向 + 関数型
•ファーストクラス関数
•静的型付け + 型推論
•Javaとの相互運用
scalaの特徴
2009年9月12日土曜日
•インタプリタで動作確認が
できる!
•型推論で簡潔なコード
•でも静的型付け言語
scalaの気持ちいいところ
2009年9月12日土曜日
•クロージャ + 充実したコレ
クションライブラリ
•Object,traitで進化したオ
ブジェクト指向
scalaの気持ちいいところ
2009年9月12日土曜日
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日土曜日
2009年9月12日土曜日
ちょwwwイwwミwwフwwwなにwwwこれww
2009年9月12日土曜日
Scalaは業務では使えない?
2009年9月12日土曜日
No!!2009年9月12日土曜日
今から実証
してやんよ!
2009年9月12日土曜日
デモっ!
2009年9月12日土曜日
demo その1
•scalaで簡単なスクリプトを書いてみる!
•twitter検索でs2conのハッシュタグを検索
•目標5分!
2009年9月12日土曜日
demo その2
•S2Console!•Seasarプロダクトをインタプリタで動作確認
•LLフレームワークの対話環境をJavaにも!
2009年9月12日土曜日
Scala言語仕様弾丸ツアー!
2009年9月12日土曜日
インタプリタで動作を
確認してみよう!
2009年9月12日土曜日
基本編
2009年9月12日土曜日
変数(var,val)
• var/valで変数を宣言• var 変数名:型 = 値• varは変更可能、valは変更不可(final)
2009年9月12日土曜日
変数(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日土曜日
型推論
•変数、関数の戻り値は省略可能
•コンパイラーが推論する•型パラメータも含めて推論•関数の引数は省略できない
2009年9月12日土曜日
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日土曜日
if文
• if/else文は値を返す• ifの条件はBoolean• elseが無い場合は値を返さない(Unit型が結果となる)
• if文の結果を変数に代入できる(三項演算子的な)
2009年9月12日土曜日
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日土曜日
for式によるループ
• for式でコレクションの反復処理(javaの拡張forに相当)
• for( 変数 <- コレクション) { ... }• コレクション生成 - for( 変数 <- コレクション) yield { ... }
• フィルター - for ( n <- 1 to 10 ; if n % 2 == 0) yield { ... }
• break/continueはない! (2.8で実装)2009年9月12日土曜日
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日土曜日
関数編
2009年9月12日土曜日
関数
def countChar ( s:String, c:Char ) : Int = {
var cnt:Int = 0
for( ct <- st if ct == c) {
cnt += 1
}
cnt
}
戻り値の型
関数名
引数仮引数:型
defで関数定義
最後に評価された値が戻り値
2009年9月12日土曜日
• def 関数名( 引数 ): 結果型 = { ... }• val f = 関数名 _ で関数オブジェクト• 関数リテラル - 無名関数的な
関数
val f = (x:Int,y:Int) => { x + y }
• 関数リテラルでは _ で引数のプレースホルダ
引数仮引数:型
本体
2009年9月12日土曜日
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日土曜日
カリー化と部分適用
• def hoge(i:Int)(j:Int) = i + j•引数を()で分けるとカリー化• hoge( 1 )(_:Int)•引数に_を指定して関数を部分適用
2009年9月12日土曜日
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日土曜日
ネスト関数とクロージャ
•関数は入れ子(ネスト)にできる!
•関数の外側の変数(自由変数)を参照できる
•自由変数への参照を実行時に取り込む (クロージャ )
2009年9月12日土曜日
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日土曜日
• scalaのコレクションは引数に関数を取るものが多い
• map,filter,foreach,exist ...•柔軟なコレクションの操作• List,Map,Setなど
コレクションに関数を
2009年9月12日土曜日
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日土曜日
クラス編
2009年9月12日土曜日
• class <クラス名>(コンストラクタ引数)• objectでシングルトン定義• ネスト classの中にclassやobject• staticがないscalaでは、コンパニオンオブジェクトを利用する
• 同一スコープに同じ名前のclassとobjectがあると特権的な アクセス権
ObjectFoo
classFoo
privateへのアクセス
クラスとオブジェクト
2009年9月12日土曜日
クラスとオブジェクト
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日土曜日
• trait は実装をもてるinterface• classやobjectに複数のtraitをMix-In• trait の中で実装を持たないメンバはabstract
traitとmixin
classFoo
traitBar
traitBaz
BarとBazから実装を
継承
2009年9月12日土曜日
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日土曜日
• case class <クラス名>(コンストラクタ引数)
• case class は名前(...)でインスタンス生成( immutable object)
• case クラスはパターンとして使える• matchはswitchの強力なやつ• 値 match { case パターン => 処理 ...}• パターン には、値/型/caseクラスを指定
caseクラスとパターンマッチ
2009年9月12日土曜日
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日土曜日
他にも変態的な言語仕様が盛りだくさん
ExtractorImplicit conversion
Structural typing
Lazy value
Partial Function
XMLリテラル
Implicitparameter
Existential type
Specialized annotation
2009年9月12日土曜日
• implicit conversion - 暗黙の型変換( StringからDoubleに自動変換etc)
• implict parameter- 型による自動判別を行うデフォルト引数
• structual typing- type safeなダックタイピング
• lazy value- 遅延評価
ちょっとだけよ・・・
2009年9月12日土曜日
• XMLリテラル- xmlをリテラルで評価
• 共変/反変なGenerics- Array[String]はArray[Any]のサブクラス
• actorライブラリ- mesage base非同期処理
• Lift web framework- 関数型webフレームワーク
ちょっとだけよ・・・
2009年9月12日土曜日
まとめっ!
2009年9月12日土曜日
フリーダムすぐる
言語仕様を楽しめ!!
2009年9月12日土曜日
JavaとLLの融合!!
2009年9月12日土曜日
進化したオブジェクト指向でJavaの常識を破壊せよ!!
2009年9月12日土曜日
関数型言語の概念を加えた次世代の
プログラミングパラダイム!!
2009年9月12日土曜日
情報源
•公式サイト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日土曜日
Have fun with
Scala !!
2009年9月12日土曜日
ご清聴ありがとうございました!
2009年9月12日土曜日