SlideShare ist ein Scribd-Unternehmen logo
1 von 52
Downloaden Sie, um offline zu lesen
闇JVMKaigi
 Scalaで萌える
関数型プログラミング
   [完全版]


              1/52
前回までのあらすじ
●   7/9(土)のOITECでScalaについてのLTを
    やったのであった!
●   時間全然足りなかったしちゃんとしたことが
    伝えきれなかった!
    (SlideShareにあげたら何人かにRTされた。
     くだらん内容でサーセン
●   今回は時間に余裕があるのでもう少し
    掘り下げてお話をしようと思ったのである!
●   OITECで実践F#をもらったのでちょっと
    なびいたのはここだけの秘密だ!
                                 2/52
今から話す人の
           ざっくりとした説明
●   角田裕樹(すみだゆうき)
●   Hatena / id:razon
●   Twitter / @razon
●   ×ラゾン ○レゾン ◎しゾン
●   天領倉敷Scalaの言いだしっぺ
●   本業はJavaプログラマ
    その時々で他のことも結構やってるけど…


                          3/52
これからお話しすること
●   Scalaってなんぞ
●   関数型プログラミングってなんぞ
●   天領倉敷Scalaって何?
●   Scala勉強するのにどうすればいいのさ
●   開発環境とかどんなのがあるのん?
●   時間が余ったらライブコーディングとか?



                           4/52
Scalaってなんぞ?


              5/52
Scalaってなんぞ?
●   スイス連邦工科大学(EPFL)のMartin Odersky
    が設計したプログラム言語
●   JVM上で動作する
    (コンパイルするとJavaのバイトコードになる)
    ※更新は止まっているが.NET向け実装
     (scala-msil)もあり
    →何か開発進めるためにMSがお金を落としている
     という怪情報がTwitter上に流れてた…
●   オブジェクト指向と関数型のハイブリッド


                                     6/52
Scalaってなんぞ?
●   JVM上で動くと何が嬉しいのん?
    →Javaとの相互利用が可能
     →Javaの資源(ライブラリ・FW・ミドル)
      がそのまま利用可能
      ・JDBCドライバ



     ・Servlet/JavaEEコンテナ



     ・などなど…
                              7/52
Scalaってなんぞ?
●   ちゃんとした所で使われてんの?
    →使われてます!




                      8/52
Scalaってなんぞ?
●   ちゃんとした所で使われてんの?
    →使われてます!




                      9/52
関数型プログラミング
  ってなんぞ?


             10/52
関数型プログラミングってなんぞ?
●   元々はラムダ計算の概念をプログラミング言
    語として体現したもの
    →理論計算機科学や数理論理学における、
     関数の定義と実行を抽象化した計算体系
●   ご先祖様はLISP
●   関数がファーストオブジェクト
    →関数を変数に格納できる
    →関数を引数の値として指定できる
    →関数を戻り値として指定できる


                           11/52
関数型プログラミングってなんぞ?
●   元々はラムダ計算の概念をプログラミング言
    語として体現したもの
    →理論計算機科学や数理論理学における、
     関数の定義と実行を抽象化した計算体系
●   ご先祖様はLISP
●   関数がファーストオブジェクト
    →関数を変数に格納できる
    →関数を引数の値として指定できる
    →関数を戻り値として指定できる
●   =高階関数!
                           12/52
関数型プログラミングってなんぞ?
●   で、何がうれしいのん?
●   関数型言語といえば、コレクションの操作!
scala> val list = 1 :: 5 :: 2 :: 3 :: 4 :: Nil
list: List[Int] = List(1, 5, 2, 3, 4)

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

scala> list.sortWith(_ < _)
res1: List[Int] = List(1, 2, 3, 4, 5)

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

scala> list.reduceLeft(_ + _)
res3: Int = 15
                                                 13/52
関数型プログラミングってなんぞ?
●   入力に対し、関数をチェーンすることで
    出力形式に変換していく
scala> list.filter(_ % 2 == 0).map(_ * 2).reduceLeft(_ + _)
res4: Int = 12




                                                              14/52
関数型プログラミングってなんぞ?
●   入力に対し、関数をチェーンすることで
    出力形式に変換していく
scala> list.filter(_ % 2 == 0).map(_ * 2).reduceLeft(_ + _)
res4: Int = 12

●   手続き型っぽい処理と比べると…
var sum = 0
for (i <- list) {
  if (i % 2 == 0) {
    sum += i * 2
  }
}

                                                              15/52
関数型プログラミングってなんぞ?
●   入力に対し、関数をチェーンすることで
    出力形式に変換していく
scala> list.filter(_ % 2 == 0).map(_ * 2).reduceLeft(_ + _)
res4: Int = 12
                 抽出              変換             集計
●   手続き型っぽい処理と比べると…
var sum = 0
for (i <- list) {
  if (i % 2 == 0) {
    sum += i * 2
  }
}
    抽出 集計 変換

                                                              16/52
関数型プログラミングってなんぞ?
●   イミュータブル!
    →作成後にその状態を変えることができない




                           17/52
関数型プログラミングってなんぞ?
●   イミュータブル!
    →作成後にその状態を変えることができない
●   えっそれ不便じゃね…?
    →覚えがありませんか?
    →どこかのタイミングでここの変数の値が
     おかしくなってエラーが出る
    →その変数(状態)が変わる(ことができる)のが原因




                                18/52
関数型プログラミングってなんぞ?
●   イミュータブル!
    →作成後にその状態を変えることができない
●   えっそれ不便じゃね…?
    →覚えがありませんか?
    →どこかのタイミングでここの変数の値が
     おかしくなってエラーが出る
    →その変数(状態)が変わる(ことができる)のが原因
●   関数型らしいコードを書くことで、
    変化する状態を最小限にすることができる
    (純粋関数型言語のHaskellなどは変数に再代入不可)




                                   19/52
関数型プログラミングってなんぞ?
●   イミュータブルの副次的な恩恵
●   テストがらくちんになる
    (状態を考慮したテストをする必要が
     なくなる)




                        20/52
関数型プログラミングってなんぞ?
●   イミュータブルの副次的な恩恵
●   テストがらくちんになる
    (状態を考慮したテストをする必要が
     なくなる)
●   並列処理がらくちんになる
    状態を持たなければ、スレッドの同期や
    ロックなどを考慮する必要がなくなる
    →Scalaでは状態を持つ場合でも比較的簡単に並列処理を
     行うためのActorライブラリというものもあります




                                   21/52
関数型プログラミングってなんぞ?
●   カリー化と部分適用
●   カリー化!
scala> def add(x: Int, y: Int) = x + y
add: (x: Int, y: Int)Int
↓
scala> def add(x: Int)(y: Int) = x + y
add: (x: Int)(y: Int)Int




                                         22/52
関数型プログラミングってなんぞ?
●   カリー化と部分適用
●   カリー化!
scala> def add(x: Int, y: Int) = x + y
add: (x: Int, y: Int)Int
↓
scala> def add(x: Int)(y: Int) = x + y
add: (x: Int)(y: Int)Int

●   部分適用!
scala> def inc = add(1)_
inc: (Int) => Int

●   その名のとおり、関数の引数の一部を適用
    した新たな関数を作ることができる
                                         23/52
関数型プログラミングってなんぞ?
●   部分適用した関数を使ってみる
scala> val list = 1 :: 2 :: 3 :: 4 :: 5 :: Nil
list: List[Int] = List(1, 2, 3, 4, 5)

scala> list.map(inc)
res1: List[Int] = List(2, 3, 4, 5, 6)




                                                 24/52
関数型プログラミングってなんぞ?
●   部分適用した関数を使ってみる
scala> val list = 1 :: 2 :: 3 :: 4 :: 5 :: Nil
list: List[Int] = List(1, 2, 3, 4, 5)

scala> list.map(inc)
res1: List[Int] = List(2, 3, 4, 5, 6)
●   カリー化しなくても、プレースホルダー構文
    で!
scala> def add(x: Int, y: Int) = x + y
add: (x: Int, y: Int)Int

scala> list.map(add(1, _))
res2: List[Int] = List(2, 3, 4, 5, 6)

                                                 25/52
関数型プログラミングってなんぞ?
●   遅延評価
●   lazy val
scala> val v = {println("Hello val !"); 0}
Hello val !
v: Int = 0

scala> lazy val lVal = {println("Hello lazy val !"); 0}
lVal: Int = <lazy>

scala> println(lVal)
Hello lazy val !
0

scala> println(lVal)
0

                                                          26/52
関数型プログラミングってなんぞ?
●   遅延評価
●   名前渡し引数
scala> val list = 1 :: 2 :: 3 :: 4 :: 5 :: Nil
list: List[Int] = List(1, 2, 3, 4, 5)

scala> val itr = list.iterator
itr: Iterator[Int] = non-empty iterator

scala> def hello(i: => Int) = {
     |   println("Excel方眼紙爆発しろ " + i)
     |   println("Excel方眼紙爆発しろ " + i)}
hello: (i: => Int)Unit

scala> hello(itr.next)
Excel方眼紙爆発しろ 1
Excel方眼紙爆発しろ 2
                                                 27/52
関数型プログラミングってなんぞ?
●   遅延評価
●   Streamによる無限リスト
scala> def makeInc(from: Int): Stream[Int] =
     |   Stream.cons(from, makeInc(from + 1))
makeInc: (from: Int)Stream[Int]

scala> val inc = makeInc(10)
inc: Stream[Int] = Stream(10, ?)

scala> inc take 5 toList
res11: List[Int] = List(10, 11, 12, 13, 14)




                                                28/52
関数型プログラミングってなんぞ?
●   パターンマッチ!
●   型別に振り分けてみる
scala> def judgeType(in: Any) = in match {
     |   case _: String => "String!"
     |   case _: Int => "Int!"
     |   case _ => "Other!"
     | }
judgeType: (in: Any)java.lang.String

scala> judgeType("1")
res1: java.lang.String = String!

scala> judgeType(1)
res2: java.lang.String = Int!

scala> judgeType(1 :: Nil)
res3: java.lang.String = Other!              29/52
関数型プログラミングってなんぞ?
●   パターンマッチ!
●   定番のFizzBuzz
scala> def fizzbuzz(n:   Int) = n match {
     |   case n if n %   15 == 0 => "fizzbuzz"
     |   case n if n %   3 == 0 => "fizz"
     |   case n if n %   5 == 0 => "buzz"
     |   case _ => n
     | }
fizzbuzz: (n: Int)Any

scala> 1 to 20 map fizzbuzz
res1: scala.collection.immutable.IndexedSeq[Any] = Vector(1,
2, fizz, 4, buzz, fizz, 7, 8, fizz, buzz, 11, fizz, 13, 14,
fizzbuzz, 16, 17, fizz, 19, buzz)


                                                               30/52
関数型プログラミングってなんぞ?
●   パターンマッチ!
●   CaseClassと組み合わせて
scala> case class Person(name: String, sex: String, age: Int)
defined class Person

scala> def judgePerson(p: Person) = p match {
     |   case Person(n, s, a) if s == "female" && a < 10 => n + ":幼女"
     |   case Person(n, s, a) if s == "female" => n + ":ババァ"
     |   case _ => "後はどうでもいい"
     | }
judgePerson: (p: Person)java.lang.String

scala> judgePerson(Person("razonの娘", "female", 2))
res1: java.lang.String = razonの娘:幼女




                                                                        31/52
天領倉敷Scala
 って何?

            32/52
天領倉敷Scalaって何?
●   岡山県倉敷市周辺でScalaの勉強会を行う
    コミュニティ
●   「天領」…江戸時代における幕府の直轄領
    倉敷市民がことあるごとに持ち上げる単語
    →正直ウンザリする
    →皮肉を込めた(天領倉敷(笑))
●   ハッシュタグは「#tkscala」
    岡山県内の勉強会コミュニティでも異彩を放つTL
    として一部で悪名高い
●   次回は8/20(土)でーす
                              33/52
Scala勉強するのに
どうしたらいいのさ

              34/52
Scala勉強するのに
         どうしたらいいのさ
    書籍
●   Scalaスケーラブルプログラミング
    [コンセプト&コーディング]
●   通称コップ本
●   聖典(Oderskyの著書)
●   キッチリ書いてある分難しい
●   あと高い(5k近くする)
●   が、買う価値はあり



                         35/52
Scala勉強するのに
           どうしたらいいのさ
    書籍
●
    Scalaプログラミング入門
●   Lift Frameworkの中の人
    David Pollakの著書
●   天領倉敷Scalaではこの本を
    ベースに学習しています
●   コップ本よりは読みやすい




                         36/52
Scala勉強するのに
          どうしたらいいのさ
    書籍
●   プログラミングScala
●   通称バク本
●   Twitter APIのリードプログラマーが
    書いてる
●   二冊目の本としてオススメの声多し




                             37/52
Scala勉強するのに
         どうしたらいいのさ
    書籍
●
    Scala実践プログラミング
●   日本のScala界の巨匠が結集して
    書かれた本
●   新しい(先月出ました)
●   和書なので読みやすい
●   初心者向けはコレが鉄板かと
●   上級者からは「物足りない」の声あり
●   ただし、他の本で触れられていない部分
    についての解説あり
    (デザパタ・限定継続など…)
                         38/52
Scala勉強するのに
         どうしたらいいのさ
    フォローするべきScalaスーパーエンジニア
●   @kmizu
    Scalaエバンジェリストといえばこの人
    ScalaDaysという世界のScala祭りで発表されてます!
    Scalaとか静的型付け vs 動的型付けなどの議論をMatzと繰
    り広げる猛者
●   @yuroyoro
    日本Scala界のスーパースター
    最近ではほむほむ言語の中の人として脚光を浴びる
    新作言語ウキャスがマジ宇宙語



                                        39/52
Scala勉強するのに
         どうしたらいいのさ
    フォローするべきScalaスーパーエンジニア
●   @xuwei_k
    Scalaについてのエントリをブログで精力的に書いてる人
    (OITEC版の資料でツッコミ頂きましたthx!)
    RubyKaigiでMatzに「Scalaの人ですね」的なことを言われ
    たとか
●   @keisuke_n
    日本のScala祭り「Scala座」第一回主催
    WebFlavorというScalaフレームワークの作者でもある
    大都会岡山クラスタ
    天領倉敷Scalaにも何度か来ていただきました


                                          40/52
Scala勉強するのに
             どうしたらいいのさ
    フォローするべきScalaスーパーエンジニア
●   その他思いつく限りでのScalaに触れてる方々
    (多分取りこぼしがいっぱいありますサーセン)
    @a_hisame, @asami224, @bleis, @cooldaemon, @cpp_akira,
    @halcat0x15a, @hito_asa, @itoasuka, @j5ik2o,
    @kaigaiengineer, @katzchang, @keigoi, @maeda_, @maiha,
    @mumoshu, @mzp, @NetPenguin, @nosen, @nouvellelune,
    @osiire, @papamitra, @PG_kura, @pomu0325, @rf0444,
    @RKTM, @ryugate, @ScalaTohoku, @shomah4a, @syuta,
    @takedasoft, @terurou, @tototoshi, @yasushia, @ymnk,
    @yoshihiro503




                                                             41/52
開発環境とか
どんなのがあるのん?


             42/52
開発環境とか
       どんなのがあるのん?
    エディタ編
●
    実はデフォルトで色んなエディタ/IDE用の拡張がついてる
    geditとかtextmateとかxcodeとか…




                                   43/52
開発環境とか
            どんなのがあるのん?
    エディタ編
●
    実はデフォルトで色んなエディタ/IDE用の拡張がついてる
    geditとかtextmateとかxcodeとか…
●   とはいえ、vim or emacs ですよね!
    →エディタ宗教戦争だー!
●   vim
    codefellowとかneocmplecacheで補完が効いたりするらし
    いですよ(emacs派なのでわかりませんサーセン←)
●   emacs
    ENSIMEというのがありますよ奥さん
    補完とかリファクタリングとか効いて結構強力
                                            44/52
開発環境とか
           どんなのがあるのん?
    IDE編
●   以前はIDEサポートが実に残念であった…
●   今では割と大丈夫なクオリティになったとか
●   IntelliJ IDEA
    昔はこれくらいしかまともに使えるIDEがなかった
    →結果、今でも使ってる人が多い(気がする)
    sbt(後述)consoleがあるのもステキ
    但し、無料版はAPサーバとの統合が無いので注意




                               45/52
開発環境とか
           どんなのがあるのん?
    IDE編
●   Eclipse
●   NetBeans
    Java開発に於いては定番ですね
    特にEclipseは昔はひっじょーーーーーに残念なクオリティ
    をしていましたが、今では結構大丈夫みたいです!
    (最近はちょろっとしか触ってないから良くわry)




                                     46/52
開発環境とか
           どんなのがあるのん?
    IDE編
●   Eclipse
●   NetBeans
    Java開発に於いては定番ですね
    特にEclipseは昔はひっじょーーーーーに残念なクオリティ
    をしていましたが、今では結構大丈夫みたいです!
    (最近はちょろっとしか触ってないから良くわry)
●   という訳で、趣味で(というか、自分の手に
    馴染むモノを)選んでいいかも?


                                     47/52
開発環境とか
          どんなのがあるのん?
    ビルドツール編
●   sbt(simple-build-tool)
●   Scalaのビルドツールはこれが鉄板
●   一部では「酢豚」とか「サバト」の愛称で親しまれる
●   mavenのpom.xmlをScalaで書く感じだと言ったら
    乱暴だろうか…
    (sbtのディレクトリ構成はmaven準拠で、連携可能)
●   Javaもビルドできる
●   ファイルの更新を検出して自動的にコンパイルしたり
    テストコード走らせたりとか

                                     48/52
デモる?
(時間の許す限り)


            49/52
あと最後に
●   魔法少女Scalaちゃん(@scalachan)を
    今すぐフォロー!




                                50/52
あと最後に



 一緒にF#
やろうぜ!
         51/52
あと最後に
●   間違えた


     一緒にScala
     やろうぜ!
                   52/52

Weitere ähnliche Inhalte

Was ist angesagt?

Scalaで型クラス入門
Scalaで型クラス入門Scalaで型クラス入門
Scalaで型クラス入門Makoto Fukuhara
 
Material
MaterialMaterial
Material_TUNE_
 
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
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdfHiroshi Ono
 
プログラミングHaskell(第1章)
プログラミングHaskell(第1章)プログラミングHaskell(第1章)
プログラミングHaskell(第1章)yaju88
 
197x 20090704 Scalaで並行プログラミング
197x 20090704 Scalaで並行プログラミング197x 20090704 Scalaで並行プログラミング
197x 20090704 Scalaで並行プログラミングNet Penguin
 
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)parrotstudio
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門Hideyuki Tanaka
 
rpscala35-scala2.9.0
rpscala35-scala2.9.0rpscala35-scala2.9.0
rpscala35-scala2.9.0Kenji Yoshida
 
Why Reactive Matters #ScalaMatsuri
Why Reactive Matters #ScalaMatsuriWhy Reactive Matters #ScalaMatsuri
Why Reactive Matters #ScalaMatsuriYuta Okamoto
 
Scala2.8への移行
Scala2.8への移行Scala2.8への移行
Scala2.8への移行guest5f4320
 
IdrisでWebアプリを書く
IdrisでWebアプリを書くIdrisでWebアプリを書く
IdrisでWebアプリを書くHideyuki Tanaka
 
なぜリアクティブは重要か #ScalaMatsuri
なぜリアクティブは重要か #ScalaMatsuriなぜリアクティブは重要か #ScalaMatsuri
なぜリアクティブは重要か #ScalaMatsuriYuta Okamoto
 
Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Ra Zon
 
たのしい高階関数
たのしい高階関数たのしい高階関数
たのしい高階関数Shinichi Kozake
 

Was ist angesagt? (20)

Thinking in Cats
Thinking in CatsThinking in Cats
Thinking in Cats
 
Scalaで型クラス入門
Scalaで型クラス入門Scalaで型クラス入門
Scalaで型クラス入門
 
Material
MaterialMaterial
Material
 
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
 
BOF1-Scala02.pdf
BOF1-Scala02.pdfBOF1-Scala02.pdf
BOF1-Scala02.pdf
 
プログラミングHaskell(第1章)
プログラミングHaskell(第1章)プログラミングHaskell(第1章)
プログラミングHaskell(第1章)
 
197x 20090704 Scalaで並行プログラミング
197x 20090704 Scalaで並行プログラミング197x 20090704 Scalaで並行プログラミング
197x 20090704 Scalaで並行プログラミング
 
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
 
Haskell超入門 Part.1
Haskell超入門 Part.1Haskell超入門 Part.1
Haskell超入門 Part.1
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門
 
ScalaMatsuri 2016
ScalaMatsuri 2016ScalaMatsuri 2016
ScalaMatsuri 2016
 
rpscala35-scala2.9.0
rpscala35-scala2.9.0rpscala35-scala2.9.0
rpscala35-scala2.9.0
 
Why Reactive Matters #ScalaMatsuri
Why Reactive Matters #ScalaMatsuriWhy Reactive Matters #ScalaMatsuri
Why Reactive Matters #ScalaMatsuri
 
Scala2.8への移行
Scala2.8への移行Scala2.8への移行
Scala2.8への移行
 
IdrisでWebアプリを書く
IdrisでWebアプリを書くIdrisでWebアプリを書く
IdrisでWebアプリを書く
 
Scala東北紹介
Scala東北紹介Scala東北紹介
Scala東北紹介
 
なぜリアクティブは重要か #ScalaMatsuri
なぜリアクティブは重要か #ScalaMatsuriなぜリアクティブは重要か #ScalaMatsuri
なぜリアクティブは重要か #ScalaMatsuri
 
Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]
 
たのしい高階関数
たのしい高階関数たのしい高階関数
たのしい高階関数
 
Rpscala2011 0601
Rpscala2011 0601Rpscala2011 0601
Rpscala2011 0601
 

Ähnlich wie Scalaで萌える関数型プログラミング[完全版]

Scalaで萌える関数型プログラミング[エッセンシャル版]
Scalaで萌える関数型プログラミング[エッセンシャル版]Scalaで萌える関数型プログラミング[エッセンシャル版]
Scalaで萌える関数型プログラミング[エッセンシャル版]Ra Zon
 
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)啓 小笠原
 
Beginners Scala in FAN 20121009
Beginners Scala in FAN 20121009Beginners Scala in FAN 20121009
Beginners Scala in FAN 20121009Taisuke Shiratori
 
Scalatronで楽しく学ぶ関数型プログラミング
Scalatronで楽しく学ぶ関数型プログラミングScalatronで楽しく学ぶ関数型プログラミング
Scalatronで楽しく学ぶ関数型プログラミングJun Saito
 
Scalaプログラミング・マニアックス
Scalaプログラミング・マニアックスScalaプログラミング・マニアックス
Scalaプログラミング・マニアックスTomoharu ASAMI
 
Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術Naoki Aoyama
 
Clojure programming-chapter-2
Clojure programming-chapter-2Clojure programming-chapter-2
Clojure programming-chapter-2Masao Kato
 
Scala勉強会_2014_11_18
Scala勉強会_2014_11_18Scala勉強会_2014_11_18
Scala勉強会_2014_11_18Shuya Tsukamoto
 
Scala Daysに行ってみて
Scala Daysに行ってみてScala Daysに行ってみて
Scala Daysに行ってみてKota Mizushima
 
Object-Funcational Analysis and design
Object-Funcational Analysis and designObject-Funcational Analysis and design
Object-Funcational Analysis and designTomoharu ASAMI
 
Laravel / Lumen 次の一歩
Laravel / Lumen 次の一歩Laravel / Lumen 次の一歩
Laravel / Lumen 次の一歩Yuuki Takezawa
 
Cookpad Summer Intern 2015 - Programming Paradigm
Cookpad Summer Intern 2015 - Programming ParadigmCookpad Summer Intern 2015 - Programming Paradigm
Cookpad Summer Intern 2015 - Programming ParadigmMinero Aoki
 
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 2 章
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 2 章【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 2 章
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 2 章YOSHIKAWA Ryota
 
Shibuya.lisp #28: 仮題: R について
Shibuya.lisp #28: 仮題: R についてShibuya.lisp #28: 仮題: R について
Shibuya.lisp #28: 仮題: R についてtnoda
 
Functional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.jsFunctional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.jsShogo Sensui
 
第2回品川Redmine勉強会(日本語全文検索)
第2回品川Redmine勉強会(日本語全文検索)第2回品川Redmine勉強会(日本語全文検索)
第2回品川Redmine勉強会(日本語全文検索)Masanori Machii
 
Terraformで始めるInfrastructure as Code
Terraformで始めるInfrastructure as CodeTerraformで始めるInfrastructure as Code
Terraformで始めるInfrastructure as CodeTakahisa Iwamoto
 

Ähnlich wie Scalaで萌える関数型プログラミング[完全版] (20)

Scalaで萌える関数型プログラミング[エッセンシャル版]
Scalaで萌える関数型プログラミング[エッセンシャル版]Scalaで萌える関数型プログラミング[エッセンシャル版]
Scalaで萌える関数型プログラミング[エッセンシャル版]
 
ATN No.2 Scala事始め
ATN No.2 Scala事始めATN No.2 Scala事始め
ATN No.2 Scala事始め
 
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)
 
Beginners Scala in FAN 20121009
Beginners Scala in FAN 20121009Beginners Scala in FAN 20121009
Beginners Scala in FAN 20121009
 
Scalatronで楽しく学ぶ関数型プログラミング
Scalatronで楽しく学ぶ関数型プログラミングScalatronで楽しく学ぶ関数型プログラミング
Scalatronで楽しく学ぶ関数型プログラミング
 
Trait in scala
Trait in scalaTrait in scala
Trait in scala
 
Scalaプログラミング・マニアックス
Scalaプログラミング・マニアックスScalaプログラミング・マニアックス
Scalaプログラミング・マニアックス
 
Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術
 
MoteMote Compiler Plugin
MoteMote Compiler PluginMoteMote Compiler Plugin
MoteMote Compiler Plugin
 
Clojure programming-chapter-2
Clojure programming-chapter-2Clojure programming-chapter-2
Clojure programming-chapter-2
 
Scala勉強会_2014_11_18
Scala勉強会_2014_11_18Scala勉強会_2014_11_18
Scala勉強会_2014_11_18
 
Scala Daysに行ってみて
Scala Daysに行ってみてScala Daysに行ってみて
Scala Daysに行ってみて
 
Object-Funcational Analysis and design
Object-Funcational Analysis and designObject-Funcational Analysis and design
Object-Funcational Analysis and design
 
Laravel / Lumen 次の一歩
Laravel / Lumen 次の一歩Laravel / Lumen 次の一歩
Laravel / Lumen 次の一歩
 
Cookpad Summer Intern 2015 - Programming Paradigm
Cookpad Summer Intern 2015 - Programming ParadigmCookpad Summer Intern 2015 - Programming Paradigm
Cookpad Summer Intern 2015 - Programming Paradigm
 
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 2 章
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 2 章【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 2 章
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 2 章
 
Shibuya.lisp #28: 仮題: R について
Shibuya.lisp #28: 仮題: R についてShibuya.lisp #28: 仮題: R について
Shibuya.lisp #28: 仮題: R について
 
Functional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.jsFunctional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.js
 
第2回品川Redmine勉強会(日本語全文検索)
第2回品川Redmine勉強会(日本語全文検索)第2回品川Redmine勉強会(日本語全文検索)
第2回品川Redmine勉強会(日本語全文検索)
 
Terraformで始めるInfrastructure as Code
Terraformで始めるInfrastructure as CodeTerraformで始めるInfrastructure as Code
Terraformで始めるInfrastructure as Code
 

Kürzlich hochgeladen

論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 

Kürzlich hochgeladen (9)

論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 

Scalaで萌える関数型プログラミング[完全版]

  • 2. 前回までのあらすじ ● 7/9(土)のOITECでScalaについてのLTを やったのであった! ● 時間全然足りなかったしちゃんとしたことが 伝えきれなかった! (SlideShareにあげたら何人かにRTされた。 くだらん内容でサーセン ● 今回は時間に余裕があるのでもう少し 掘り下げてお話をしようと思ったのである! ● OITECで実践F#をもらったのでちょっと なびいたのはここだけの秘密だ! 2/52
  • 3. 今から話す人の ざっくりとした説明 ● 角田裕樹(すみだゆうき) ● Hatena / id:razon ● Twitter / @razon ● ×ラゾン ○レゾン ◎しゾン ● 天領倉敷Scalaの言いだしっぺ ● 本業はJavaプログラマ その時々で他のことも結構やってるけど… 3/52
  • 4. これからお話しすること ● Scalaってなんぞ ● 関数型プログラミングってなんぞ ● 天領倉敷Scalaって何? ● Scala勉強するのにどうすればいいのさ ● 開発環境とかどんなのがあるのん? ● 時間が余ったらライブコーディングとか? 4/52
  • 6. Scalaってなんぞ? ● スイス連邦工科大学(EPFL)のMartin Odersky が設計したプログラム言語 ● JVM上で動作する (コンパイルするとJavaのバイトコードになる) ※更新は止まっているが.NET向け実装 (scala-msil)もあり →何か開発進めるためにMSがお金を落としている という怪情報がTwitter上に流れてた… ● オブジェクト指向と関数型のハイブリッド 6/52
  • 7. Scalaってなんぞ? ● JVM上で動くと何が嬉しいのん? →Javaとの相互利用が可能 →Javaの資源(ライブラリ・FW・ミドル) がそのまま利用可能 ・JDBCドライバ ・Servlet/JavaEEコンテナ ・などなど… 7/52
  • 8. Scalaってなんぞ? ● ちゃんとした所で使われてんの? →使われてます! 8/52
  • 9. Scalaってなんぞ? ● ちゃんとした所で使われてんの? →使われてます! 9/52
  • 11. 関数型プログラミングってなんぞ? ● 元々はラムダ計算の概念をプログラミング言 語として体現したもの →理論計算機科学や数理論理学における、 関数の定義と実行を抽象化した計算体系 ● ご先祖様はLISP ● 関数がファーストオブジェクト →関数を変数に格納できる →関数を引数の値として指定できる →関数を戻り値として指定できる 11/52
  • 12. 関数型プログラミングってなんぞ? ● 元々はラムダ計算の概念をプログラミング言 語として体現したもの →理論計算機科学や数理論理学における、 関数の定義と実行を抽象化した計算体系 ● ご先祖様はLISP ● 関数がファーストオブジェクト →関数を変数に格納できる →関数を引数の値として指定できる →関数を戻り値として指定できる ● =高階関数! 12/52
  • 13. 関数型プログラミングってなんぞ? ● で、何がうれしいのん? ● 関数型言語といえば、コレクションの操作! scala> val list = 1 :: 5 :: 2 :: 3 :: 4 :: Nil list: List[Int] = List(1, 5, 2, 3, 4) scala> list.filter(_ % 2 == 0) res0: List[Int] = List(2, 4) scala> list.sortWith(_ < _) res1: List[Int] = List(1, 2, 3, 4, 5) scala> list.map(_ * 2) res2: List[Int] = List(2, 10, 4, 6, 8) scala> list.reduceLeft(_ + _) res3: Int = 15 13/52
  • 14. 関数型プログラミングってなんぞ? ● 入力に対し、関数をチェーンすることで 出力形式に変換していく scala> list.filter(_ % 2 == 0).map(_ * 2).reduceLeft(_ + _) res4: Int = 12 14/52
  • 15. 関数型プログラミングってなんぞ? ● 入力に対し、関数をチェーンすることで 出力形式に変換していく scala> list.filter(_ % 2 == 0).map(_ * 2).reduceLeft(_ + _) res4: Int = 12 ● 手続き型っぽい処理と比べると… var sum = 0 for (i <- list) { if (i % 2 == 0) { sum += i * 2 } } 15/52
  • 16. 関数型プログラミングってなんぞ? ● 入力に対し、関数をチェーンすることで 出力形式に変換していく scala> list.filter(_ % 2 == 0).map(_ * 2).reduceLeft(_ + _) res4: Int = 12 抽出 変換 集計 ● 手続き型っぽい処理と比べると… var sum = 0 for (i <- list) { if (i % 2 == 0) { sum += i * 2 } } 抽出 集計 変換 16/52
  • 17. 関数型プログラミングってなんぞ? ● イミュータブル! →作成後にその状態を変えることができない 17/52
  • 18. 関数型プログラミングってなんぞ? ● イミュータブル! →作成後にその状態を変えることができない ● えっそれ不便じゃね…? →覚えがありませんか? →どこかのタイミングでここの変数の値が おかしくなってエラーが出る →その変数(状態)が変わる(ことができる)のが原因 18/52
  • 19. 関数型プログラミングってなんぞ? ● イミュータブル! →作成後にその状態を変えることができない ● えっそれ不便じゃね…? →覚えがありませんか? →どこかのタイミングでここの変数の値が おかしくなってエラーが出る →その変数(状態)が変わる(ことができる)のが原因 ● 関数型らしいコードを書くことで、 変化する状態を最小限にすることができる (純粋関数型言語のHaskellなどは変数に再代入不可) 19/52
  • 20. 関数型プログラミングってなんぞ? ● イミュータブルの副次的な恩恵 ● テストがらくちんになる (状態を考慮したテストをする必要が なくなる) 20/52
  • 21. 関数型プログラミングってなんぞ? ● イミュータブルの副次的な恩恵 ● テストがらくちんになる (状態を考慮したテストをする必要が なくなる) ● 並列処理がらくちんになる 状態を持たなければ、スレッドの同期や ロックなどを考慮する必要がなくなる →Scalaでは状態を持つ場合でも比較的簡単に並列処理を 行うためのActorライブラリというものもあります 21/52
  • 22. 関数型プログラミングってなんぞ? ● カリー化と部分適用 ● カリー化! scala> def add(x: Int, y: Int) = x + y add: (x: Int, y: Int)Int ↓ scala> def add(x: Int)(y: Int) = x + y add: (x: Int)(y: Int)Int 22/52
  • 23. 関数型プログラミングってなんぞ? ● カリー化と部分適用 ● カリー化! scala> def add(x: Int, y: Int) = x + y add: (x: Int, y: Int)Int ↓ scala> def add(x: Int)(y: Int) = x + y add: (x: Int)(y: Int)Int ● 部分適用! scala> def inc = add(1)_ inc: (Int) => Int ● その名のとおり、関数の引数の一部を適用 した新たな関数を作ることができる 23/52
  • 24. 関数型プログラミングってなんぞ? ● 部分適用した関数を使ってみる scala> val list = 1 :: 2 :: 3 :: 4 :: 5 :: Nil list: List[Int] = List(1, 2, 3, 4, 5) scala> list.map(inc) res1: List[Int] = List(2, 3, 4, 5, 6) 24/52
  • 25. 関数型プログラミングってなんぞ? ● 部分適用した関数を使ってみる scala> val list = 1 :: 2 :: 3 :: 4 :: 5 :: Nil list: List[Int] = List(1, 2, 3, 4, 5) scala> list.map(inc) res1: List[Int] = List(2, 3, 4, 5, 6) ● カリー化しなくても、プレースホルダー構文 で! scala> def add(x: Int, y: Int) = x + y add: (x: Int, y: Int)Int scala> list.map(add(1, _)) res2: List[Int] = List(2, 3, 4, 5, 6) 25/52
  • 26. 関数型プログラミングってなんぞ? ● 遅延評価 ● lazy val scala> val v = {println("Hello val !"); 0} Hello val ! v: Int = 0 scala> lazy val lVal = {println("Hello lazy val !"); 0} lVal: Int = <lazy> scala> println(lVal) Hello lazy val ! 0 scala> println(lVal) 0 26/52
  • 27. 関数型プログラミングってなんぞ? ● 遅延評価 ● 名前渡し引数 scala> val list = 1 :: 2 :: 3 :: 4 :: 5 :: Nil list: List[Int] = List(1, 2, 3, 4, 5) scala> val itr = list.iterator itr: Iterator[Int] = non-empty iterator scala> def hello(i: => Int) = { | println("Excel方眼紙爆発しろ " + i) | println("Excel方眼紙爆発しろ " + i)} hello: (i: => Int)Unit scala> hello(itr.next) Excel方眼紙爆発しろ 1 Excel方眼紙爆発しろ 2 27/52
  • 28. 関数型プログラミングってなんぞ? ● 遅延評価 ● Streamによる無限リスト scala> def makeInc(from: Int): Stream[Int] = | Stream.cons(from, makeInc(from + 1)) makeInc: (from: Int)Stream[Int] scala> val inc = makeInc(10) inc: Stream[Int] = Stream(10, ?) scala> inc take 5 toList res11: List[Int] = List(10, 11, 12, 13, 14) 28/52
  • 29. 関数型プログラミングってなんぞ? ● パターンマッチ! ● 型別に振り分けてみる scala> def judgeType(in: Any) = in match { | case _: String => "String!" | case _: Int => "Int!" | case _ => "Other!" | } judgeType: (in: Any)java.lang.String scala> judgeType("1") res1: java.lang.String = String! scala> judgeType(1) res2: java.lang.String = Int! scala> judgeType(1 :: Nil) res3: java.lang.String = Other! 29/52
  • 30. 関数型プログラミングってなんぞ? ● パターンマッチ! ● 定番のFizzBuzz scala> def fizzbuzz(n: Int) = n match { | case n if n % 15 == 0 => "fizzbuzz" | case n if n % 3 == 0 => "fizz" | case n if n % 5 == 0 => "buzz" | case _ => n | } fizzbuzz: (n: Int)Any scala> 1 to 20 map fizzbuzz res1: scala.collection.immutable.IndexedSeq[Any] = Vector(1, 2, fizz, 4, buzz, fizz, 7, 8, fizz, buzz, 11, fizz, 13, 14, fizzbuzz, 16, 17, fizz, 19, buzz) 30/52
  • 31. 関数型プログラミングってなんぞ? ● パターンマッチ! ● CaseClassと組み合わせて scala> case class Person(name: String, sex: String, age: Int) defined class Person scala> def judgePerson(p: Person) = p match { | case Person(n, s, a) if s == "female" && a < 10 => n + ":幼女" | case Person(n, s, a) if s == "female" => n + ":ババァ" | case _ => "後はどうでもいい" | } judgePerson: (p: Person)java.lang.String scala> judgePerson(Person("razonの娘", "female", 2)) res1: java.lang.String = razonの娘:幼女 31/52
  • 33. 天領倉敷Scalaって何? ● 岡山県倉敷市周辺でScalaの勉強会を行う コミュニティ ● 「天領」…江戸時代における幕府の直轄領 倉敷市民がことあるごとに持ち上げる単語 →正直ウンザリする →皮肉を込めた(天領倉敷(笑)) ● ハッシュタグは「#tkscala」 岡山県内の勉強会コミュニティでも異彩を放つTL として一部で悪名高い ● 次回は8/20(土)でーす 33/52
  • 35. Scala勉強するのに どうしたらいいのさ 書籍 ● Scalaスケーラブルプログラミング [コンセプト&コーディング] ● 通称コップ本 ● 聖典(Oderskyの著書) ● キッチリ書いてある分難しい ● あと高い(5k近くする) ● が、買う価値はあり 35/52
  • 36. Scala勉強するのに どうしたらいいのさ 書籍 ● Scalaプログラミング入門 ● Lift Frameworkの中の人 David Pollakの著書 ● 天領倉敷Scalaではこの本を ベースに学習しています ● コップ本よりは読みやすい 36/52
  • 37. Scala勉強するのに どうしたらいいのさ 書籍 ● プログラミングScala ● 通称バク本 ● Twitter APIのリードプログラマーが 書いてる ● 二冊目の本としてオススメの声多し 37/52
  • 38. Scala勉強するのに どうしたらいいのさ 書籍 ● Scala実践プログラミング ● 日本のScala界の巨匠が結集して 書かれた本 ● 新しい(先月出ました) ● 和書なので読みやすい ● 初心者向けはコレが鉄板かと ● 上級者からは「物足りない」の声あり ● ただし、他の本で触れられていない部分 についての解説あり (デザパタ・限定継続など…) 38/52
  • 39. Scala勉強するのに どうしたらいいのさ フォローするべきScalaスーパーエンジニア ● @kmizu Scalaエバンジェリストといえばこの人 ScalaDaysという世界のScala祭りで発表されてます! Scalaとか静的型付け vs 動的型付けなどの議論をMatzと繰 り広げる猛者 ● @yuroyoro 日本Scala界のスーパースター 最近ではほむほむ言語の中の人として脚光を浴びる 新作言語ウキャスがマジ宇宙語 39/52
  • 40. Scala勉強するのに どうしたらいいのさ フォローするべきScalaスーパーエンジニア ● @xuwei_k Scalaについてのエントリをブログで精力的に書いてる人 (OITEC版の資料でツッコミ頂きましたthx!) RubyKaigiでMatzに「Scalaの人ですね」的なことを言われ たとか ● @keisuke_n 日本のScala祭り「Scala座」第一回主催 WebFlavorというScalaフレームワークの作者でもある 大都会岡山クラスタ 天領倉敷Scalaにも何度か来ていただきました 40/52
  • 41. Scala勉強するのに どうしたらいいのさ フォローするべきScalaスーパーエンジニア ● その他思いつく限りでのScalaに触れてる方々 (多分取りこぼしがいっぱいありますサーセン) @a_hisame, @asami224, @bleis, @cooldaemon, @cpp_akira, @halcat0x15a, @hito_asa, @itoasuka, @j5ik2o, @kaigaiengineer, @katzchang, @keigoi, @maeda_, @maiha, @mumoshu, @mzp, @NetPenguin, @nosen, @nouvellelune, @osiire, @papamitra, @PG_kura, @pomu0325, @rf0444, @RKTM, @ryugate, @ScalaTohoku, @shomah4a, @syuta, @takedasoft, @terurou, @tototoshi, @yasushia, @ymnk, @yoshihiro503 41/52
  • 43. 開発環境とか どんなのがあるのん? エディタ編 ● 実はデフォルトで色んなエディタ/IDE用の拡張がついてる geditとかtextmateとかxcodeとか… 43/52
  • 44. 開発環境とか どんなのがあるのん? エディタ編 ● 実はデフォルトで色んなエディタ/IDE用の拡張がついてる geditとかtextmateとかxcodeとか… ● とはいえ、vim or emacs ですよね! →エディタ宗教戦争だー! ● vim codefellowとかneocmplecacheで補完が効いたりするらし いですよ(emacs派なのでわかりませんサーセン←) ● emacs ENSIMEというのがありますよ奥さん 補完とかリファクタリングとか効いて結構強力 44/52
  • 45. 開発環境とか どんなのがあるのん? IDE編 ● 以前はIDEサポートが実に残念であった… ● 今では割と大丈夫なクオリティになったとか ● IntelliJ IDEA 昔はこれくらいしかまともに使えるIDEがなかった →結果、今でも使ってる人が多い(気がする) sbt(後述)consoleがあるのもステキ 但し、無料版はAPサーバとの統合が無いので注意 45/52
  • 46. 開発環境とか どんなのがあるのん? IDE編 ● Eclipse ● NetBeans Java開発に於いては定番ですね 特にEclipseは昔はひっじょーーーーーに残念なクオリティ をしていましたが、今では結構大丈夫みたいです! (最近はちょろっとしか触ってないから良くわry) 46/52
  • 47. 開発環境とか どんなのがあるのん? IDE編 ● Eclipse ● NetBeans Java開発に於いては定番ですね 特にEclipseは昔はひっじょーーーーーに残念なクオリティ をしていましたが、今では結構大丈夫みたいです! (最近はちょろっとしか触ってないから良くわry) ● という訳で、趣味で(というか、自分の手に 馴染むモノを)選んでいいかも? 47/52
  • 48. 開発環境とか どんなのがあるのん? ビルドツール編 ● sbt(simple-build-tool) ● Scalaのビルドツールはこれが鉄板 ● 一部では「酢豚」とか「サバト」の愛称で親しまれる ● mavenのpom.xmlをScalaで書く感じだと言ったら 乱暴だろうか… (sbtのディレクトリ構成はmaven準拠で、連携可能) ● Javaもビルドできる ● ファイルの更新を検出して自動的にコンパイルしたり テストコード走らせたりとか 48/52
  • 50. あと最後に ● 魔法少女Scalaちゃん(@scalachan)を 今すぐフォロー! 50/52
  • 52. あと最後に ● 間違えた 一緒にScala やろうぜ! 52/52