SlideShare une entreprise Scribd logo
1  sur  26
Télécharger pour lire hors ligne
Scalaミニチュートリアル
~Introduction to Scala~


 筑波大学大学院システム情報工学研究科
        水島 宏太
はじめに
 Scalaの概要について構文ごとに説明します
 Javaと特に異なる文法については

  Javaと比較して説明します
 ディープなScalaの話はしません

 スカラの話はしません
Scala?
   最近話題の言語
       Matzにっき など
       Actorライブラリなどで注目を集めている
       ポストJava?
   静的型付けオブジェクト指向関数型言語
   作者:Martin Odersky
       JavaへのGenerics導入の貢献者の一人
   JVM上で動作する処理系
   近代的な言語仕様
関数型言語?
   明確な定義は無い
       副作用無しのスタイルを積極的にサポート?
       OOPと同じくらい曖昧
   具体例
       純粋:Haskell
       非純粋:Scala,SML,OCaml,Scheme,...
       関数型ではない:C,C++,Java,C#,Ruby,...
hello, world
object HelloWorld {
  def main(args :Array[String]) :Unit = {
    println("hello, world")
  }
}
      objectでシングルトンオブジェクトを定義(後述)
      defでメソッド定義
      Array[String] ≒ String[]
      Unit ≒ void
      以降、mainの定義は省略
変数の宣言(varとval)
var x = 1 // ≒ var x :Int = 1
var y = 2 // ≒ var y :Int = 2
val z = x + y // ≒ val z :Int = x + y
println(z)
      varで変数(変更可能)を宣言
          Javaの通常の変数と同じ
          変数の型は省略可能(右辺の型から推論される)
      valで変数(変更不能)を宣言
          Javaのfinalな変数
          変数の型は省略可能
条件分岐(if)
val num = args(0).toInt
println(
  if(num % 2 == 0) "偶数" else "奇数"
)
      Javaのifに類似
      elseを書くと値を返すことができる
          Javaの?:演算子と同じようにも使える
      elseを書かない場合Unit型の値が返る
forによる繰り返し(1)
var sum = 0
for(arg <- args) sum += arg.toInt
println(sum)
      コマンドライン引数の合計値を計算するプロ
       グラム
      forでコレクションの要素について繰り返し
          Javaの拡張for文に類似
              実際には拡張for文よりも強力
          argの型は省略可能(推論される)
forによる繰り返し(2)
for(i <- 1 to 100) {
  println(if(i%15 == 0) "FizzBuzz" else if(i%3 == 0) "Fizz"
          else if(i%5 == 0) "Buzz" else i.toString)
}
      Fizz Buzzプログラム
      x to yでxからyまでのRangeを生成
        x.to(y)と同じ意味(.や()などを省略可能)

      ifが値を返す
        elseを省略した場合は、Unit型の値を返す

      整数もオブジェクト → メソッドが呼び出せる
whileによる繰り返し
var sum = 0
var i = 0
while(i < args.length) {
  sum += args(i).toInt
  i += 1
}
println(sum)
      コマンドライン引数の合計値を計算
      forよりも冗長だが、forよりも高速
          性能をチューニングしたいときに使う
高階関数(1)
println(args.foldLeft(0)((sum, n) => sum+n.toInt))
      コマンドライン引数の合計値を計算するプロ
       グラム
      (x,...) => ...で無名関数を定義
          Javaの無名クラスのようなもの
          無名関数の引数の型が推論可能なときは省略可能
      foldLeft: 関数を引数に取るメソッド(高階関数)
          ...f(f(f(0, args(0)), args(1)), args(2))...
          関数型言語でループを書くための一般的な方法
高階関数(2)
println((0/:args)(_+_.toInt))
      コマンドライン引数の合計値を計算するプロ
       グラム
      /: ≒ foldLeft
          末尾に:の付いた演算子は左右逆に適用
              (x /: y)(z) → y./:(x)(z)
      _+_.toInt ≒ (x, y) => x+y.toInt
          式に「穴を開けた」無名関数を定義
高階関数(3)
import java.io._
def open(path :String)(block :InputStream => Unit) {
  val in = new FileInputStream(path)
  try { block(in) } finally { in.close; println("closed") }
}
open("hoge.txt"){in => () } // inは自動的にcloseされる
      リソースが自動的にcloseされるopen
      X => Y:「Xを受け取ってYを返す関数」の型
          InputStream => Unit
           「InputStreamを受け取り何も返さない関数」
          引数無しメソッドの呼び出しの()は省略可能
クラス定義(1)
class HelloWorld {
  def display() :Unit = println(toString())
  override def toString() = "hello, world"
}
(new HelloWorld).display // hello, world
      classに続けてクラス名を記述
        Javaとほぼ同じ

      返り値の型は省略可能(推論される)
      overrideでメソッドをオーバーライド
        Javaの@Overrideアノテーションと同じ

        overrideを忘れた場合エラー
クラス定義(2)
class Point(val x :Int, val y :Int) {
  def +(p :Point) = new Point(x+p.x, y+p.x)
  override def toString() = "Point(" + x + ", " + y + ")"
}
val p = new Point(1, 2) + new Point(2, 2)
println(p) // Point(3, 4)
println(p.x, p.y) //(3,4)
      二次元座標上の点を表現するクラス
      クラス名に続けてコンストラクタ引数を定義
          valをつけると外部から読み取り可能
          引数のスコープはクラス定義全体
      演算子は通常のメソッドとして定義
クラス定義(3)
import javax.swing._
class MyFrame extends JFrame("フレーム1") {
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
  setSize(800, 600)
}
(new MyFrame).setVisible(true)
      extendsに続けてスーパークラスを指定
          Javaと同じ
      スーパークラスのコンストラクタに渡す引数は
       スーパークラス名に続けて記述
      クラス定義中の実行文はインスタンス生成
       時に実行される
trait
trait Foo {
  def foo() :String = "Foo"
}
trait Bar {
  def foo() :String
  def bar() :Unit = println(foo() + "Bar")
}
class FooBar extends Foo with Bar
(new FooBar).bar() // FooBar
       traitに続けて名前と記述
       インスタンスが生成できない一種のクラス
           実装を持つことができる
       多重継承が可能
object
object MyRunnable extends Runnable {
  def run() :Unit = {
    for(i <- 1 to 100) print(i)
  }
}
new Thread(MyRunnable).start // 12345...100
     シングルトンオブジェクトを定義可能
         newでインスタンスの生成不可能
     クラスと同様にスーパークラスを指定可能
Implicit Conversion(1)
implicit def int2String(i :Int) :String = i.toString
val n = 54321
println(n.substring(0, 3)) // 543
println(n.endsWith(1)) // true
      implicit defで暗黙の型変換を定義
        Int(引数の型)→ String(返り値の型)

        Int型に存在しないメソッドの呼び出しを検出

       → Stringへの暗黙の変換をコンパイラが試みる
      危険な変換を定義しないようにするのは自己責任
        String → Intなど
Implicit Conversion(2)
class RangeExt(range :Range) {
  def exclude(elem :Int) = range.filter(e => e != elem)
}
implicit def range2RangeExt(r :Range) :RangeExt = new RangeExt(r)
for(i <- 1 to 5 exclude 3) print(i) // 1245
       implicit defで暗黙の型変換を定義
           Range(引数の型)→ RangeExt(返り値の型)
           Rangeにexcludeメソッドが追加されたように見える
       既存のクラスにメソッドを追加(したように見せかけるこ
        とが)可能
パターンマッチング(1)
println(args(0) match {
  case "apple" => "りんご"
  case "grape" => "ぶどう"
  case "peach" => "桃"
  case _       => "その他"
})
      式 match { case パターン => ... }
        switch(式) { case 定数: ... }に相当

        _はdefault相当

      値を返すことができる
      switch文をより強力にしたようなもの
パターンマッチング(2)
println(args match {
  case Array("foo","bar")   =>   "FooBar"
  case Array("bar","foo")   =>   "BarFoo"
  case Array(name)          =>   name
  case _                    =>   "default"
})
      パターンにマッチした値を変数に束縛可能
        1要素の配列について、要素をnameに束縛

      構造を持ったデータをパターンマッチに使える
        コレクションなど
Case Class
abstract class Exp
case class Add(l :Exp, r :Exp) extends Exp
case class Num(v :Int) extends Exp
def eval(exp :Exp) :Int = exp match {
  case Add(l, r) => eval(l) + eval(r)
  case Num(v)    => v
}
println(eval(Add(Num(1), Num(2)))) // 3
      caseをclassの前に付加して定義
      名前(...)でインスタンスが生成可能
      パターンマッチに使える
Structural Typing
object Java { def name() :String = "じゃヴぁ" }
object CSharp { def name() :String = "しーしゃーぷ" }
object Scala { def name(): String = "すから" }
def printName(x :{ def name() :String }) = println(x.name)
printName(Java)      // じゃヴぁ
printName(CSharp)    // しーしゃーぷ
printName(Scala)     // すから
      静的に型チェックされるduck typing
        特定のシグニチャのメソッド(の集まり)を持

         っているかのみがチェックされる
紹介しなかったScalaの機能
   Lazy Value
       遅延評価
   Generics
       Java Genericsと類似しているが、より強力
   Abstract Type
   Existential Type
       Java Genericsのワイルドカードに似たもの
   Extractor
   XML関係の機能
       リテラル
       パターンマッチング
まとめ
   Scalaの言語仕様の概要を駆け足で紹介
       制御構文
       OOP機能
           クラス,object,trait
       関数型の機能
           高階関数,パターンマッチング, case class
       (おそらく)Scalaに特異な機能
           implicit conversion
   是非、Scalaを一度お試しください!

Contenu connexe

Tendances

ジェネリクスの基礎と応用 JJUG CCC 2012 Fall
ジェネリクスの基礎と応用 JJUG CCC 2012 Fallジェネリクスの基礎と応用 JJUG CCC 2012 Fall
ジェネリクスの基礎と応用 JJUG CCC 2012 Fallnagise
 
あなたのScalaを爆速にする7つの方法(日本語版)
あなたのScalaを爆速にする7つの方法(日本語版)あなたのScalaを爆速にする7つの方法(日本語版)
あなたのScalaを爆速にする7つの方法(日本語版)x1 ichi
 
Equality in Scala (ScalaMatsuri 2020)
Equality in Scala (ScalaMatsuri 2020)Equality in Scala (ScalaMatsuri 2020)
Equality in Scala (ScalaMatsuri 2020)Eugene Yokota
 
はてなブックマーク in Scala
はてなブックマーク in Scalaはてなブックマーク in Scala
はてなブックマーク in ScalaLintaro Ina
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdfHiroshi Ono
 
15分でざっくり分かるScala入門
15分でざっくり分かるScala入門15分でざっくり分かるScala入門
15分でざっくり分かるScala入門SatoYu1ro
 
Sns suite presentation
Sns suite presentationSns suite presentation
Sns suite presentationJason Namkung
 
Why Reactive Matters #ScalaMatsuri
Why Reactive Matters #ScalaMatsuriWhy Reactive Matters #ScalaMatsuri
Why Reactive Matters #ScalaMatsuriYuta Okamoto
 
JavaのGenericsとは?
JavaのGenericsとは?JavaのGenericsとは?
JavaのGenericsとは?Kenji Nakamura
 
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜Hiromi Ishii
 
AuxパターンをDottyで解決する
AuxパターンをDottyで解決するAuxパターンをDottyで解決する
AuxパターンをDottyで解決するTaisuke Oe
 
rpscala35-scala2.9.0
rpscala35-scala2.9.0rpscala35-scala2.9.0
rpscala35-scala2.9.0Kenji Yoshida
 
Material
MaterialMaterial
Material_TUNE_
 
Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Ra Zon
 
Javaプログラミング入門【第2回】
Javaプログラミング入門【第2回】Javaプログラミング入門【第2回】
Javaプログラミング入門【第2回】Yukiko Kato
 
Javaプログラミング入門【第7回】
Javaプログラミング入門【第7回】Javaプログラミング入門【第7回】
Javaプログラミング入門【第7回】Yukiko Kato
 

Tendances (20)

ジェネリクスの基礎と応用 JJUG CCC 2012 Fall
ジェネリクスの基礎と応用 JJUG CCC 2012 Fallジェネリクスの基礎と応用 JJUG CCC 2012 Fall
ジェネリクスの基礎と応用 JJUG CCC 2012 Fall
 
あなたのScalaを爆速にする7つの方法(日本語版)
あなたのScalaを爆速にする7つの方法(日本語版)あなたのScalaを爆速にする7つの方法(日本語版)
あなたのScalaを爆速にする7つの方法(日本語版)
 
Equality in Scala (ScalaMatsuri 2020)
Equality in Scala (ScalaMatsuri 2020)Equality in Scala (ScalaMatsuri 2020)
Equality in Scala (ScalaMatsuri 2020)
 
はてなブックマーク in Scala
はてなブックマーク in Scalaはてなブックマーク in Scala
はてなブックマーク in Scala
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdf
 
15分でざっくり分かるScala入門
15分でざっくり分かるScala入門15分でざっくり分かるScala入門
15分でざっくり分かるScala入門
 
Sns suite presentation
Sns suite presentationSns suite presentation
Sns suite presentation
 
Why Reactive Matters #ScalaMatsuri
Why Reactive Matters #ScalaMatsuriWhy Reactive Matters #ScalaMatsuri
Why Reactive Matters #ScalaMatsuri
 
JavaのGenericsとは?
JavaのGenericsとは?JavaのGenericsとは?
JavaのGenericsとは?
 
たのしい関数型
たのしい関数型たのしい関数型
たのしい関数型
 
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
 
AuxパターンをDottyで解決する
AuxパターンをDottyで解決するAuxパターンをDottyで解決する
AuxパターンをDottyで解決する
 
rpscala35-scala2.9.0
rpscala35-scala2.9.0rpscala35-scala2.9.0
rpscala35-scala2.9.0
 
Material
MaterialMaterial
Material
 
Rpscala2011 0601
Rpscala2011 0601Rpscala2011 0601
Rpscala2011 0601
 
Phantom Type in Scala
Phantom Type in ScalaPhantom Type in Scala
Phantom Type in Scala
 
Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]
 
Javaプログラミング入門【第2回】
Javaプログラミング入門【第2回】Javaプログラミング入門【第2回】
Javaプログラミング入門【第2回】
 
Javaプログラミング入門【第7回】
Javaプログラミング入門【第7回】Javaプログラミング入門【第7回】
Javaプログラミング入門【第7回】
 
Haskell超入門 Part.1
Haskell超入門 Part.1Haskell超入門 Part.1
Haskell超入門 Part.1
 

En vedette

scalaliftoff2009.pdf
scalaliftoff2009.pdfscalaliftoff2009.pdf
scalaliftoff2009.pdfHiroshi Ono
 
scalaliftoff2009.pdf
scalaliftoff2009.pdfscalaliftoff2009.pdf
scalaliftoff2009.pdfHiroshi Ono
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfHiroshi Ono
 
scalaliftoff2009.pdf
scalaliftoff2009.pdfscalaliftoff2009.pdf
scalaliftoff2009.pdfHiroshi Ono
 
SACSIS2009_TCP.pdf
SACSIS2009_TCP.pdfSACSIS2009_TCP.pdf
SACSIS2009_TCP.pdfHiroshi Ono
 
Canonical and robotos (2)
Canonical and robotos (2)Canonical and robotos (2)
Canonical and robotos (2)panchaloha
 
program_draft3.pdf
program_draft3.pdfprogram_draft3.pdf
program_draft3.pdfHiroshi Ono
 
kademlia-1227143905867010-8.pdf
kademlia-1227143905867010-8.pdfkademlia-1227143905867010-8.pdf
kademlia-1227143905867010-8.pdfHiroshi Ono
 
Meet and Greet w/ New VP of Programs Sandra Nathan.
Meet and Greet w/ New VP of Programs Sandra Nathan.Meet and Greet w/ New VP of Programs Sandra Nathan.
Meet and Greet w/ New VP of Programs Sandra Nathan.MarinGrassroots
 
Writing for web & blog wordpress 19.1.2012
Writing for web & blog wordpress 19.1.2012Writing for web & blog wordpress 19.1.2012
Writing for web & blog wordpress 19.1.2012Caridad Camacho
 
TwitterOct2008.pdf
TwitterOct2008.pdfTwitterOct2008.pdf
TwitterOct2008.pdfHiroshi Ono
 
stateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdf
stateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdfstateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdf
stateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdfHiroshi Ono
 
TwitterOct2008.pdf
TwitterOct2008.pdfTwitterOct2008.pdf
TwitterOct2008.pdfHiroshi Ono
 

En vedette (15)

scalaliftoff2009.pdf
scalaliftoff2009.pdfscalaliftoff2009.pdf
scalaliftoff2009.pdf
 
scalaliftoff2009.pdf
scalaliftoff2009.pdfscalaliftoff2009.pdf
scalaliftoff2009.pdf
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
 
scalaliftoff2009.pdf
scalaliftoff2009.pdfscalaliftoff2009.pdf
scalaliftoff2009.pdf
 
SACSIS2009_TCP.pdf
SACSIS2009_TCP.pdfSACSIS2009_TCP.pdf
SACSIS2009_TCP.pdf
 
Canonical and robotos (2)
Canonical and robotos (2)Canonical and robotos (2)
Canonical and robotos (2)
 
program_draft3.pdf
program_draft3.pdfprogram_draft3.pdf
program_draft3.pdf
 
kademlia-1227143905867010-8.pdf
kademlia-1227143905867010-8.pdfkademlia-1227143905867010-8.pdf
kademlia-1227143905867010-8.pdf
 
Meet and Greet w/ New VP of Programs Sandra Nathan.
Meet and Greet w/ New VP of Programs Sandra Nathan.Meet and Greet w/ New VP of Programs Sandra Nathan.
Meet and Greet w/ New VP of Programs Sandra Nathan.
 
Writing for web & blog wordpress 19.1.2012
Writing for web & blog wordpress 19.1.2012Writing for web & blog wordpress 19.1.2012
Writing for web & blog wordpress 19.1.2012
 
camel-scala.pdf
camel-scala.pdfcamel-scala.pdf
camel-scala.pdf
 
TwitterOct2008.pdf
TwitterOct2008.pdfTwitterOct2008.pdf
TwitterOct2008.pdf
 
名言
名言名言
名言
 
stateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdf
stateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdfstateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdf
stateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdf
 
TwitterOct2008.pdf
TwitterOct2008.pdfTwitterOct2008.pdf
TwitterOct2008.pdf
 

Similaire à BOF1-Scala02.pdf

ゆるふわScalaコップ本読書会 第7章
ゆるふわScalaコップ本読書会 第7章ゆるふわScalaコップ本読書会 第7章
ゆるふわScalaコップ本読書会 第7章Yuta Yokoi
 
JavaScript超入門 基礎
JavaScript超入門 基礎JavaScript超入門 基礎
JavaScript超入門 基礎tetsu6
 
第2回関数型言語勉強会 大阪
第2回関数型言語勉強会 大阪第2回関数型言語勉強会 大阪
第2回関数型言語勉強会 大阪Naoki Kitora
 
ちょっと詳しくJavaScript 第2回【関数と引数】
ちょっと詳しくJavaScript 第2回【関数と引数】ちょっと詳しくJavaScript 第2回【関数と引数】
ちょっと詳しくJavaScript 第2回【関数と引数】株式会社ランチェスター
 
JavaScriptユーティリティライブラリの紹介
JavaScriptユーティリティライブラリの紹介JavaScriptユーティリティライブラリの紹介
JavaScriptユーティリティライブラリの紹介Yusuke Hirao
 
JSX / Haxe / TypeScript
JSX / Haxe / TypeScriptJSX / Haxe / TypeScript
JSX / Haxe / TypeScriptbleis tift
 
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Ransui Iso
 
JavaScriptクイックスタート
JavaScriptクイックスタートJavaScriptクイックスタート
JavaScriptクイックスタートShumpei Shiraishi
 
Xtend - Javaの未来を今すぐ使う
Xtend - Javaの未来を今すぐ使うXtend - Javaの未来を今すぐ使う
Xtend - Javaの未来を今すぐ使うTatsumi Naganuma
 
LastaFluteでKotlinをはじめよう
LastaFluteでKotlinをはじめようLastaFluteでKotlinをはじめよう
LastaFluteでKotlinをはじめようShinsuke Sugaya
 
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミング(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミングOuka Yuka
 
Introduction to Spray at Kansai Functional Programming
Introduction to Spray at Kansai Functional ProgrammingIntroduction to Spray at Kansai Functional Programming
Introduction to Spray at Kansai Functional ProgrammingSuguru Hamazaki
 

Similaire à BOF1-Scala02.pdf (20)

Power of Scala
Power of ScalaPower of Scala
Power of Scala
 
ゆるふわScalaコップ本読書会 第7章
ゆるふわScalaコップ本読書会 第7章ゆるふわScalaコップ本読書会 第7章
ゆるふわScalaコップ本読書会 第7章
 
大人のお型付け
大人のお型付け大人のお型付け
大人のお型付け
 
JavaScript超入門 基礎
JavaScript超入門 基礎JavaScript超入門 基礎
JavaScript超入門 基礎
 
Haxe
HaxeHaxe
Haxe
 
ATN No.2 Scala事始め
ATN No.2 Scala事始めATN No.2 Scala事始め
ATN No.2 Scala事始め
 
第2回関数型言語勉強会 大阪
第2回関数型言語勉強会 大阪第2回関数型言語勉強会 大阪
第2回関数型言語勉強会 大阪
 
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
 
Swiftおさらい
SwiftおさらいSwiftおさらい
Swiftおさらい
 
ちょっと詳しくJavaScript 第2回【関数と引数】
ちょっと詳しくJavaScript 第2回【関数と引数】ちょっと詳しくJavaScript 第2回【関数と引数】
ちょっと詳しくJavaScript 第2回【関数と引数】
 
JavaScriptユーティリティライブラリの紹介
JavaScriptユーティリティライブラリの紹介JavaScriptユーティリティライブラリの紹介
JavaScriptユーティリティライブラリの紹介
 
JSX / Haxe / TypeScript
JSX / Haxe / TypeScriptJSX / Haxe / TypeScript
JSX / Haxe / TypeScript
 
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2
 
Scala東北紹介
Scala東北紹介Scala東北紹介
Scala東北紹介
 
Haskell で CLI
Haskell で CLIHaskell で CLI
Haskell で CLI
 
JavaScriptクイックスタート
JavaScriptクイックスタートJavaScriptクイックスタート
JavaScriptクイックスタート
 
Xtend - Javaの未来を今すぐ使う
Xtend - Javaの未来を今すぐ使うXtend - Javaの未来を今すぐ使う
Xtend - Javaの未来を今すぐ使う
 
LastaFluteでKotlinをはじめよう
LastaFluteでKotlinをはじめようLastaFluteでKotlinをはじめよう
LastaFluteでKotlinをはじめよう
 
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミング(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
 
Introduction to Spray at Kansai Functional Programming
Introduction to Spray at Kansai Functional ProgrammingIntroduction to Spray at Kansai Functional Programming
Introduction to Spray at Kansai Functional Programming
 

Plus de Hiroshi Ono

Voltdb - wikipedia
Voltdb - wikipediaVoltdb - wikipedia
Voltdb - wikipediaHiroshi Ono
 
Gamecenter概説
Gamecenter概説Gamecenter概説
Gamecenter概説Hiroshi Ono
 
EventDrivenArchitecture
EventDrivenArchitectureEventDrivenArchitecture
EventDrivenArchitectureHiroshi Ono
 
program_draft3.pdf
program_draft3.pdfprogram_draft3.pdf
program_draft3.pdfHiroshi Ono
 
nodalities_issue7.pdf
nodalities_issue7.pdfnodalities_issue7.pdf
nodalities_issue7.pdfHiroshi Ono
 
genpaxospublic-090703114743-phpapp01.pdf
genpaxospublic-090703114743-phpapp01.pdfgenpaxospublic-090703114743-phpapp01.pdf
genpaxospublic-090703114743-phpapp01.pdfHiroshi Ono
 
kademlia-1227143905867010-8.pdf
kademlia-1227143905867010-8.pdfkademlia-1227143905867010-8.pdf
kademlia-1227143905867010-8.pdfHiroshi Ono
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfHiroshi Ono
 
downey08semaphores.pdf
downey08semaphores.pdfdowney08semaphores.pdf
downey08semaphores.pdfHiroshi Ono
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdfHiroshi Ono
 
stateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdf
stateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdfstateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdf
stateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdfHiroshi Ono
 
nodalities_issue7.pdf
nodalities_issue7.pdfnodalities_issue7.pdf
nodalities_issue7.pdfHiroshi Ono
 
genpaxospublic-090703114743-phpapp01.pdf
genpaxospublic-090703114743-phpapp01.pdfgenpaxospublic-090703114743-phpapp01.pdf
genpaxospublic-090703114743-phpapp01.pdfHiroshi Ono
 
kademlia-1227143905867010-8.pdf
kademlia-1227143905867010-8.pdfkademlia-1227143905867010-8.pdf
kademlia-1227143905867010-8.pdfHiroshi Ono
 
downey08semaphores.pdf
downey08semaphores.pdfdowney08semaphores.pdf
downey08semaphores.pdfHiroshi Ono
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdfHiroshi Ono
 
pamphlet_honsyou.pdf
pamphlet_honsyou.pdfpamphlet_honsyou.pdf
pamphlet_honsyou.pdfHiroshi Ono
 
program_draft3.pdf
program_draft3.pdfprogram_draft3.pdf
program_draft3.pdfHiroshi Ono
 

Plus de Hiroshi Ono (20)

Voltdb - wikipedia
Voltdb - wikipediaVoltdb - wikipedia
Voltdb - wikipedia
 
Gamecenter概説
Gamecenter概説Gamecenter概説
Gamecenter概説
 
EventDrivenArchitecture
EventDrivenArchitectureEventDrivenArchitecture
EventDrivenArchitecture
 
program_draft3.pdf
program_draft3.pdfprogram_draft3.pdf
program_draft3.pdf
 
nodalities_issue7.pdf
nodalities_issue7.pdfnodalities_issue7.pdf
nodalities_issue7.pdf
 
genpaxospublic-090703114743-phpapp01.pdf
genpaxospublic-090703114743-phpapp01.pdfgenpaxospublic-090703114743-phpapp01.pdf
genpaxospublic-090703114743-phpapp01.pdf
 
kademlia-1227143905867010-8.pdf
kademlia-1227143905867010-8.pdfkademlia-1227143905867010-8.pdf
kademlia-1227143905867010-8.pdf
 
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdfpragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
 
downey08semaphores.pdf
downey08semaphores.pdfdowney08semaphores.pdf
downey08semaphores.pdf
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdf
 
camel-scala.pdf
camel-scala.pdfcamel-scala.pdf
camel-scala.pdf
 
stateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdf
stateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdfstateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdf
stateyouredoingitwrongjavaone2009-090617031310-phpapp02.pdf
 
nodalities_issue7.pdf
nodalities_issue7.pdfnodalities_issue7.pdf
nodalities_issue7.pdf
 
genpaxospublic-090703114743-phpapp01.pdf
genpaxospublic-090703114743-phpapp01.pdfgenpaxospublic-090703114743-phpapp01.pdf
genpaxospublic-090703114743-phpapp01.pdf
 
kademlia-1227143905867010-8.pdf
kademlia-1227143905867010-8.pdfkademlia-1227143905867010-8.pdf
kademlia-1227143905867010-8.pdf
 
downey08semaphores.pdf
downey08semaphores.pdfdowney08semaphores.pdf
downey08semaphores.pdf
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdf
 
pamphlet_honsyou.pdf
pamphlet_honsyou.pdfpamphlet_honsyou.pdf
pamphlet_honsyou.pdf
 
camel-scala.pdf
camel-scala.pdfcamel-scala.pdf
camel-scala.pdf
 
program_draft3.pdf
program_draft3.pdfprogram_draft3.pdf
program_draft3.pdf
 

BOF1-Scala02.pdf

  • 1. Scalaミニチュートリアル ~Introduction to Scala~ 筑波大学大学院システム情報工学研究科 水島 宏太
  • 3. Scala?  最近話題の言語  Matzにっき など  Actorライブラリなどで注目を集めている  ポストJava?  静的型付けオブジェクト指向関数型言語  作者:Martin Odersky  JavaへのGenerics導入の貢献者の一人  JVM上で動作する処理系  近代的な言語仕様
  • 4. 関数型言語?  明確な定義は無い  副作用無しのスタイルを積極的にサポート?  OOPと同じくらい曖昧  具体例  純粋:Haskell  非純粋:Scala,SML,OCaml,Scheme,...  関数型ではない:C,C++,Java,C#,Ruby,...
  • 5. hello, world object HelloWorld { def main(args :Array[String]) :Unit = { println("hello, world") } }  objectでシングルトンオブジェクトを定義(後述)  defでメソッド定義  Array[String] ≒ String[]  Unit ≒ void  以降、mainの定義は省略
  • 6. 変数の宣言(varとval) var x = 1 // ≒ var x :Int = 1 var y = 2 // ≒ var y :Int = 2 val z = x + y // ≒ val z :Int = x + y println(z)  varで変数(変更可能)を宣言  Javaの通常の変数と同じ  変数の型は省略可能(右辺の型から推論される)  valで変数(変更不能)を宣言  Javaのfinalな変数  変数の型は省略可能
  • 7. 条件分岐(if) val num = args(0).toInt println( if(num % 2 == 0) "偶数" else "奇数" )  Javaのifに類似  elseを書くと値を返すことができる  Javaの?:演算子と同じようにも使える  elseを書かない場合Unit型の値が返る
  • 8. forによる繰り返し(1) var sum = 0 for(arg <- args) sum += arg.toInt println(sum)  コマンドライン引数の合計値を計算するプロ グラム  forでコレクションの要素について繰り返し  Javaの拡張for文に類似  実際には拡張for文よりも強力  argの型は省略可能(推論される)
  • 9. forによる繰り返し(2) for(i <- 1 to 100) { println(if(i%15 == 0) "FizzBuzz" else if(i%3 == 0) "Fizz" else if(i%5 == 0) "Buzz" else i.toString) }  Fizz Buzzプログラム  x to yでxからyまでのRangeを生成  x.to(y)と同じ意味(.や()などを省略可能)  ifが値を返す  elseを省略した場合は、Unit型の値を返す  整数もオブジェクト → メソッドが呼び出せる
  • 10. whileによる繰り返し var sum = 0 var i = 0 while(i < args.length) { sum += args(i).toInt i += 1 } println(sum)  コマンドライン引数の合計値を計算  forよりも冗長だが、forよりも高速  性能をチューニングしたいときに使う
  • 11. 高階関数(1) println(args.foldLeft(0)((sum, n) => sum+n.toInt))  コマンドライン引数の合計値を計算するプロ グラム  (x,...) => ...で無名関数を定義  Javaの無名クラスのようなもの  無名関数の引数の型が推論可能なときは省略可能  foldLeft: 関数を引数に取るメソッド(高階関数)  ...f(f(f(0, args(0)), args(1)), args(2))...  関数型言語でループを書くための一般的な方法
  • 12. 高階関数(2) println((0/:args)(_+_.toInt))  コマンドライン引数の合計値を計算するプロ グラム  /: ≒ foldLeft  末尾に:の付いた演算子は左右逆に適用  (x /: y)(z) → y./:(x)(z)  _+_.toInt ≒ (x, y) => x+y.toInt  式に「穴を開けた」無名関数を定義
  • 13. 高階関数(3) import java.io._ def open(path :String)(block :InputStream => Unit) { val in = new FileInputStream(path) try { block(in) } finally { in.close; println("closed") } } open("hoge.txt"){in => () } // inは自動的にcloseされる  リソースが自動的にcloseされるopen  X => Y:「Xを受け取ってYを返す関数」の型  InputStream => Unit 「InputStreamを受け取り何も返さない関数」  引数無しメソッドの呼び出しの()は省略可能
  • 14. クラス定義(1) class HelloWorld { def display() :Unit = println(toString()) override def toString() = "hello, world" } (new HelloWorld).display // hello, world  classに続けてクラス名を記述  Javaとほぼ同じ  返り値の型は省略可能(推論される)  overrideでメソッドをオーバーライド  Javaの@Overrideアノテーションと同じ  overrideを忘れた場合エラー
  • 15. クラス定義(2) class Point(val x :Int, val y :Int) { def +(p :Point) = new Point(x+p.x, y+p.x) override def toString() = "Point(" + x + ", " + y + ")" } val p = new Point(1, 2) + new Point(2, 2) println(p) // Point(3, 4) println(p.x, p.y) //(3,4)  二次元座標上の点を表現するクラス  クラス名に続けてコンストラクタ引数を定義  valをつけると外部から読み取り可能  引数のスコープはクラス定義全体  演算子は通常のメソッドとして定義
  • 16. クラス定義(3) import javax.swing._ class MyFrame extends JFrame("フレーム1") { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) setSize(800, 600) } (new MyFrame).setVisible(true)  extendsに続けてスーパークラスを指定  Javaと同じ  スーパークラスのコンストラクタに渡す引数は スーパークラス名に続けて記述  クラス定義中の実行文はインスタンス生成 時に実行される
  • 17. trait trait Foo { def foo() :String = "Foo" } trait Bar { def foo() :String def bar() :Unit = println(foo() + "Bar") } class FooBar extends Foo with Bar (new FooBar).bar() // FooBar  traitに続けて名前と記述  インスタンスが生成できない一種のクラス  実装を持つことができる  多重継承が可能
  • 18. object object MyRunnable extends Runnable { def run() :Unit = { for(i <- 1 to 100) print(i) } } new Thread(MyRunnable).start // 12345...100  シングルトンオブジェクトを定義可能  newでインスタンスの生成不可能  クラスと同様にスーパークラスを指定可能
  • 19. Implicit Conversion(1) implicit def int2String(i :Int) :String = i.toString val n = 54321 println(n.substring(0, 3)) // 543 println(n.endsWith(1)) // true  implicit defで暗黙の型変換を定義  Int(引数の型)→ String(返り値の型)  Int型に存在しないメソッドの呼び出しを検出 → Stringへの暗黙の変換をコンパイラが試みる  危険な変換を定義しないようにするのは自己責任  String → Intなど
  • 20. Implicit Conversion(2) class RangeExt(range :Range) { def exclude(elem :Int) = range.filter(e => e != elem) } implicit def range2RangeExt(r :Range) :RangeExt = new RangeExt(r) for(i <- 1 to 5 exclude 3) print(i) // 1245  implicit defで暗黙の型変換を定義  Range(引数の型)→ RangeExt(返り値の型)  Rangeにexcludeメソッドが追加されたように見える  既存のクラスにメソッドを追加(したように見せかけるこ とが)可能
  • 21. パターンマッチング(1) println(args(0) match { case "apple" => "りんご" case "grape" => "ぶどう" case "peach" => "桃" case _ => "その他" })  式 match { case パターン => ... }  switch(式) { case 定数: ... }に相当  _はdefault相当  値を返すことができる  switch文をより強力にしたようなもの
  • 22. パターンマッチング(2) println(args match { case Array("foo","bar") => "FooBar" case Array("bar","foo") => "BarFoo" case Array(name) => name case _ => "default" })  パターンにマッチした値を変数に束縛可能  1要素の配列について、要素をnameに束縛  構造を持ったデータをパターンマッチに使える  コレクションなど
  • 23. Case Class abstract class Exp case class Add(l :Exp, r :Exp) extends Exp case class Num(v :Int) extends Exp def eval(exp :Exp) :Int = exp match { case Add(l, r) => eval(l) + eval(r) case Num(v) => v } println(eval(Add(Num(1), Num(2)))) // 3  caseをclassの前に付加して定義  名前(...)でインスタンスが生成可能  パターンマッチに使える
  • 24. Structural Typing object Java { def name() :String = "じゃヴぁ" } object CSharp { def name() :String = "しーしゃーぷ" } object Scala { def name(): String = "すから" } def printName(x :{ def name() :String }) = println(x.name) printName(Java) // じゃヴぁ printName(CSharp) // しーしゃーぷ printName(Scala) // すから  静的に型チェックされるduck typing  特定のシグニチャのメソッド(の集まり)を持 っているかのみがチェックされる
  • 25. 紹介しなかったScalaの機能  Lazy Value  遅延評価  Generics  Java Genericsと類似しているが、より強力  Abstract Type  Existential Type  Java Genericsのワイルドカードに似たもの  Extractor  XML関係の機能  リテラル  パターンマッチング
  • 26. まとめ  Scalaの言語仕様の概要を駆け足で紹介  制御構文  OOP機能  クラス,object,trait  関数型の機能  高階関数,パターンマッチング, case class  (おそらく)Scalaに特異な機能  implicit conversion  是非、Scalaを一度お試しください!