SlideShare a Scribd company logo
Scala会議倉敷サテライト
 Scalaで萌える
関数型プログラミング
    [1.1.RC1]


                 1/53
前回までのあらすじ
●   7/9(土)のOITECでScalaについてのLTを
    やったのであった!
●   更に7/17(日)オープンラボ備後で完全版の
    セッションをやった!
●   今回はその再放送版です
    (若干新しい情報を盛り込んだりしてます)
●   OITECで実践F#をもらったのでちょっと
    なびいたのはここだけの秘密だ!


                                 2/53
今から話す人の
           ざっくりとした説明
●   角田裕樹(すみだゆうき)
●   Hatena / id:razon
●   Twitter / @razon
●   ×ラゾン ○レゾン ◎しゾン
●   天領倉敷Scalaの言いだしっぺ
●   本業はJavaプログラマ
    その時々で他のことも結構やってるけど…


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



                           4/53
Scalaってなんぞ?


              5/53
Scalaってなんぞ?
●   スイス連邦工科大学(EPFL)のMartin Odersky
    が設計したプログラム言語
●   JVM上で動作する
    (コンパイルするとJavaのバイトコードになる)
    ※.NET向け実装をMS支援のもと絶賛開発中
    →VisualStudioで開発できるとか(な、なんd(ry
    →IKVMベース(.Net上で動くJava実装)
●   オブジェクト指向と関数型のハイブリッド



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



     ・Servlet/JavaEEコンテナ



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




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




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


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


                           11/53
関数型プログラミングってなんぞ?
●   元々はラムダ計算の概念をプログラミング言
    語として体現したもの
    →理論計算機科学や数理論理学における、
     関数の定義と実行を抽象化した計算体系
●   ご先祖様はLISP
●   関数がファーストオブジェクト
    →関数を変数に格納できる
    →関数を引数の値として指定できる
    →関数を戻り値として指定できる
●   =高階関数!
                           12/53
関数型プログラミングってなんぞ?
●   で、何がうれしいのん?
●   関数型言語といえば、コレクションの操作!
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/53
関数型プログラミングってなんぞ?
●   入力に対し、関数をチェーンすることで
    出力形式に変換していく
scala> list.filter(_ % 2 == 0).map(_ * 2).reduceLeft(_ + _)
res4: Int = 12




                                                              14/53
関数型プログラミングってなんぞ?
●   入力に対し、関数をチェーンすることで
    出力形式に変換していく
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/53
関数型プログラミングってなんぞ?
●   入力に対し、関数をチェーンすることで
    出力形式に変換していく
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/53
関数型プログラミングってなんぞ?
●   イミュータブル!
    →作成後にその状態を変えることができない




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




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




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




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




                                   21/53
関数型プログラミングってなんぞ?
●   カリー化と部分適用
●   カリー化!
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/53
関数型プログラミングってなんぞ?
●   カリー化と部分適用
●   カリー化!
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/53
関数型プログラミングってなんぞ?
●   部分適用した関数を使ってみる
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/53
関数型プログラミングってなんぞ?
●   部分適用した関数を使ってみる
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/53
関数型プログラミングってなんぞ?
●   遅延評価
●   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/53
関数型プログラミングってなんぞ?
●   遅延評価
●   名前渡し引数
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/53
関数型プログラミングってなんぞ?
●   遅延評価
●   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/53
関数型プログラミングってなんぞ?
●   パターンマッチ!
●   型別に振り分けてみる
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/53
関数型プログラミングってなんぞ?
●   パターンマッチ!
●   定番の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/53
関数型プログラミングってなんぞ?
●   パターンマッチ!
●   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/53
天領倉敷Scala
 って何?

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

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

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




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




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



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


                                          40/53
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/53
Scala勉強するのに
              どうしたらいいのさ
    参考にしたいサイトとか
●   本家
    http://www.scala-lang.org/
●   プログラミング言語Scala 日本語情報サイト
    https://sites.google.com/site/scalajp/
●   Scala開眼
    http://www.h7.dion.ne.jp/~samwyn/Scala/scalaindex.htm
●   Scala勉強会@東北
    https://sites.google.com/site/scalatohoku/




                                                            42/53
開発環境とか
どんなのがあるのん?


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




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




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




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


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

                                     49/53
デモる?
(時間の許す限り)


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




                                51/53
あと最後に



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


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

More Related Content

PDF
磯野ー!関数型言語やろうぜー!
PDF
関数型プログラミング in javascript
PDF
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
PDF
たのしい関数型
PDF
Material
PDF
たのしい高階関数
PDF
関数プログラミング入門
KEY
Clojure programming-chapter-2
磯野ー!関数型言語やろうぜー!
関数型プログラミング in javascript
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
たのしい関数型
Material
たのしい高階関数
関数プログラミング入門
Clojure programming-chapter-2

What's hot (19)

PDF
Scalaで萌える関数型プログラミング[完全版]
PDF
Java電卓勉強会資料
PDF
Java初心者勉強会(2015/08/07)資料
PPTX
関数型言語&形式的手法セミナー(3)
PDF
HiroshimaJUG の 「Java8 Lambda ハンズオン with すごい広島」 を5分で振り返る
PDF
JSX / Haxe / TypeScript
PDF
Phantom Type in Scala
PDF
Clojure
PDF
C++コミュニティーの中心でC++をDISる
PDF
わんくま同盟大阪勉強会#61
PDF
Lisp tutorial for Pythonista : Day 2
PDF
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 2 章
PDF
Haskell超入門 Part.1
PDF
What is template
PDF
Thinking in Cats
PPTX
【java8 勉強会】 怖くない!ラムダ式, Stream API
PDF
Scalaノススメ
PDF
Replace Output Iterator and Extend Range JP
PDF
15分でざっくり分かるScala入門
Scalaで萌える関数型プログラミング[完全版]
Java電卓勉強会資料
Java初心者勉強会(2015/08/07)資料
関数型言語&形式的手法セミナー(3)
HiroshimaJUG の 「Java8 Lambda ハンズオン with すごい広島」 を5分で振り返る
JSX / Haxe / TypeScript
Phantom Type in Scala
Clojure
C++コミュニティーの中心でC++をDISる
わんくま同盟大阪勉強会#61
Lisp tutorial for Pythonista : Day 2
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 2 章
Haskell超入門 Part.1
What is template
Thinking in Cats
【java8 勉強会】 怖くない!ラムダ式, Stream API
Scalaノススメ
Replace Output Iterator and Extend Range JP
15分でざっくり分かるScala入門
Ad

Similar to Scalaで萌える関数型プログラミング[1.1.RC1] (20)

PDF
Scalaで萌える関数型プログラミング[エッセンシャル版]
PPTX
ゼロから始めるScala文法 (再)
PDF
プログラミング言語Scala
PDF
Object-Funcational Analysis and design
PDF
関数型言語テイスティング: Haskell, Scala, Clojure, Elixirを比べて味わう関数型プログラミングの旨さ
PDF
Scalaプログラミング・マニアックス
KEY
Beginners Scala in FAN 20121009
PDF
こわくないScala
PDF
JavaからScala、そしてClojureへ: 実務で活きる関数型プログラミング
PDF
Scala is-unscared
PDF
第2回関数型言語勉強会 大阪
PDF
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
PPTX
Scala勉強会 初心者向けハンズオン前編
PDF
命令プログラミングから関数プログラミングへ
PDF
From Scala/Clojure to Kotlin
PDF
Scala の関数型プログラミングを支える技術
PDF
Scala conf2013
PPTX
函数プログラミングの エッセンスと考え方
PDF
実務者のためのかんたんScalaz
PDF
関数プログラミング入門
Scalaで萌える関数型プログラミング[エッセンシャル版]
ゼロから始めるScala文法 (再)
プログラミング言語Scala
Object-Funcational Analysis and design
関数型言語テイスティング: Haskell, Scala, Clojure, Elixirを比べて味わう関数型プログラミングの旨さ
Scalaプログラミング・マニアックス
Beginners Scala in FAN 20121009
こわくないScala
JavaからScala、そしてClojureへ: 実務で活きる関数型プログラミング
Scala is-unscared
第2回関数型言語勉強会 大阪
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
Scala勉強会 初心者向けハンズオン前編
命令プログラミングから関数プログラミングへ
From Scala/Clojure to Kotlin
Scala の関数型プログラミングを支える技術
Scala conf2013
函数プログラミングの エッセンスと考え方
実務者のためのかんたんScalaz
関数プログラミング入門
Ad

Scalaで萌える関数型プログラミング[1.1.RC1]

  • 2. 前回までのあらすじ ● 7/9(土)のOITECでScalaについてのLTを やったのであった! ● 更に7/17(日)オープンラボ備後で完全版の セッションをやった! ● 今回はその再放送版です (若干新しい情報を盛り込んだりしてます) ● OITECで実践F#をもらったのでちょっと なびいたのはここだけの秘密だ! 2/53
  • 3. 今から話す人の ざっくりとした説明 ● 角田裕樹(すみだゆうき) ● Hatena / id:razon ● Twitter / @razon ● ×ラゾン ○レゾン ◎しゾン ● 天領倉敷Scalaの言いだしっぺ ● 本業はJavaプログラマ その時々で他のことも結構やってるけど… 3/53
  • 4. これからお話しすること ● Scalaってなんぞ ● 関数型プログラミングってなんぞ ● 天領倉敷Scalaって何? ● Scala勉強するのにどうすればいいのさ ● 開発環境とかどんなのがあるのん? ● 時間が余ったらライブコーディングとか? 4/53
  • 6. Scalaってなんぞ? ● スイス連邦工科大学(EPFL)のMartin Odersky が設計したプログラム言語 ● JVM上で動作する (コンパイルするとJavaのバイトコードになる) ※.NET向け実装をMS支援のもと絶賛開発中 →VisualStudioで開発できるとか(な、なんd(ry →IKVMベース(.Net上で動くJava実装) ● オブジェクト指向と関数型のハイブリッド 6/53
  • 7. Scalaってなんぞ? ● JVM上で動くと何が嬉しいのん? →Javaとの相互利用が可能 →Javaの資源(ライブラリ・FW・ミドル) がそのまま利用可能 ・JDBCドライバ ・Servlet/JavaEEコンテナ ・などなど… 7/53
  • 8. Scalaってなんぞ? ● ちゃんとした所で使われてんの? →使われてます! 8/53
  • 9. Scalaってなんぞ? ● ちゃんとした所で使われてんの? →使われてます! 9/53
  • 11. 関数型プログラミングってなんぞ? ● 元々はラムダ計算の概念をプログラミング言 語として体現したもの →理論計算機科学や数理論理学における、 関数の定義と実行を抽象化した計算体系 ● ご先祖様はLISP ● 関数がファーストオブジェクト →関数を変数に格納できる →関数を引数の値として指定できる →関数を戻り値として指定できる 11/53
  • 12. 関数型プログラミングってなんぞ? ● 元々はラムダ計算の概念をプログラミング言 語として体現したもの →理論計算機科学や数理論理学における、 関数の定義と実行を抽象化した計算体系 ● ご先祖様はLISP ● 関数がファーストオブジェクト →関数を変数に格納できる →関数を引数の値として指定できる →関数を戻り値として指定できる ● =高階関数! 12/53
  • 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/53
  • 14. 関数型プログラミングってなんぞ? ● 入力に対し、関数をチェーンすることで 出力形式に変換していく scala> list.filter(_ % 2 == 0).map(_ * 2).reduceLeft(_ + _) res4: Int = 12 14/53
  • 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/53
  • 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/53
  • 17. 関数型プログラミングってなんぞ? ● イミュータブル! →作成後にその状態を変えることができない 17/53
  • 18. 関数型プログラミングってなんぞ? ● イミュータブル! →作成後にその状態を変えることができない ● えっそれ不便じゃね…? →覚えがありませんか? →どこかのタイミングでここの変数の値が おかしくなってエラーが出る →その変数(状態)が変わる(ことができる)のが原因 18/53
  • 19. 関数型プログラミングってなんぞ? ● イミュータブル! →作成後にその状態を変えることができない ● えっそれ不便じゃね…? →覚えがありませんか? →どこかのタイミングでここの変数の値が おかしくなってエラーが出る →その変数(状態)が変わる(ことができる)のが原因 ● 関数型らしいコードを書くことで、 変化する状態を最小限にすることができる (純粋関数型言語のHaskellなどは変数に再代入不可) 19/53
  • 20. 関数型プログラミングってなんぞ? ● イミュータブルの副次的な恩恵 ● テストがらくちんになる (状態を考慮したテストをする必要が なくなる) 20/53
  • 21. 関数型プログラミングってなんぞ? ● イミュータブルの副次的な恩恵 ● テストがらくちんになる (状態を考慮したテストをする必要が なくなる) ● 並列処理がらくちんになる 状態を持たなければ、スレッドの同期や ロックなどを考慮する必要がなくなる →Scalaでは状態を持つ場合でも比較的簡単に並列処理を 行うためのActorライブラリというものもあります 21/53
  • 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/53
  • 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/53
  • 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/53
  • 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/53
  • 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/53
  • 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/53
  • 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/53
  • 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/53
  • 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/53
  • 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/53
  • 33. 天領倉敷Scalaって何? ● 岡山県倉敷市周辺でScalaの勉強会を行う コミュニティ ● 「天領」…江戸時代における幕府の直轄領 倉敷市民がことあるごとに持ち上げる単語 →正直ウンザリする →皮肉を込めた(天領倉敷(笑)) ● ハッシュタグは「#tkscala」 岡山県内の勉強会コミュニティでも異彩を放つTL として一部で悪名高い ● 次回は8/20(土)でーす 33/53
  • 35. Scala勉強するのに どうしたらいいのさ 書籍 ● Scalaスケーラブルプログラミング [コンセプト&コーディング] ● 通称コップ本 ● 聖典(Oderskyの著書) ● キッチリ書いてある分難しい ● あと高い(5k近くする) ● が、買う価値はあり ● 9/27に第2版が発売(予定)なので、そちらをどうぞ 35/53
  • 36. Scala勉強するのに どうしたらいいのさ 書籍 ● Scalaプログラミング入門 ● Lift Frameworkの中の人 David Pollakの著書 ● 天領倉敷Scalaではこの本を ベースに学習しています ● コップ本よりは読みやすい 36/53
  • 37. Scala勉強するのに どうしたらいいのさ 書籍 ● プログラミングScala ● 通称バク本 ● Twitter APIのリードプログラマーが 書いてる ● 二冊目の本としてオススメの声多し 37/53
  • 38. Scala勉強するのに どうしたらいいのさ 書籍 ● Scala実践プログラミング ● 日本のScala界の巨匠が結集して 書かれた本 ● 新しい(先月出ました) ● 和書なので読みやすい ● 初心者向けはコレが鉄板かと ● 上級者からは「物足りない」の声あり ● ただし、他の本で触れられていない部分 についての解説あり (デザパタ・限定継続など…) 38/53
  • 39. Scala勉強するのに どうしたらいいのさ フォローするべきScalaスーパーエンジニア ● @kmizu Scalaエバンジェリストといえばこの人 ScalaDaysという世界のScala祭りで発表されてます! Scalaとか静的型付け vs 動的型付けなどの議論をMatzと繰 り広げる猛者 ● @yuroyoro 日本Scala界のスーパースター 最近ではほむほむ言語の中の人として脚光を浴びる 新作言語ウキャスがマジ宇宙語 39/53
  • 40. Scala勉強するのに どうしたらいいのさ フォローするべきScalaスーパーエンジニア ● @xuwei_k Scalaについてのエントリをブログで精力的に書いてる人 (OITEC版の資料でツッコミ頂きましたthx!) RubyKaigiでMatzに「Scalaの人ですね」的なことを言われ たとか ● @keisuke_n 日本のScala祭り「Scala座」第一回主催 WebFlavorというScalaフレームワークの作者でもある 大都会岡山クラスタ 天領倉敷Scalaにも何度か来ていただきました 40/53
  • 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/53
  • 42. Scala勉強するのに どうしたらいいのさ 参考にしたいサイトとか ● 本家 http://www.scala-lang.org/ ● プログラミング言語Scala 日本語情報サイト https://sites.google.com/site/scalajp/ ● Scala開眼 http://www.h7.dion.ne.jp/~samwyn/Scala/scalaindex.htm ● Scala勉強会@東北 https://sites.google.com/site/scalatohoku/ 42/53
  • 44. 開発環境とか どんなのがあるのん? エディタ編 ● 実はデフォルトで色んなエディタ/IDE用の拡張がついてる geditとかtextmateとかxcodeとか… 44/53
  • 45. 開発環境とか どんなのがあるのん? エディタ編 ● 実はデフォルトで色んなエディタ/IDE用の拡張がついてる geditとかtextmateとかxcodeとか… ● とはいえ、vim or emacs ですよね! →エディタ宗教戦争だー! ● vim codefellowとかneocmplecacheで補完が効いたりするらし いですよ(emacs派なのでわかりませんサーセン←) ● emacs ENSIMEというのがありますよ奥さん 補完とかリファクタリングとか効いて結構強力 45/53
  • 46. 開発環境とか どんなのがあるのん? IDE編 ● 以前はIDEサポートが実に残念であった… ● 今では割と大丈夫なクオリティになったとか ● IntelliJ IDEA 昔はこれくらいしかまともに使えるIDEがなかった →結果、今でも使ってる人が多い(気がする) sbt(後述)consoleがあるのもステキ 但し、無料版はAPサーバとの統合が無いので注意 46/53
  • 47. 開発環境とか どんなのがあるのん? IDE編 ● Eclipse ● NetBeans Java開発に於いては定番ですね 特にEclipseは昔はひっじょーーーーーに残念なクオリティ をしていましたが、今では結構大丈夫みたいです! (最近はちょろっとしか触ってないから良くわry) 47/53
  • 48. 開発環境とか どんなのがあるのん? IDE編 ● Eclipse ● NetBeans Java開発に於いては定番ですね 特にEclipseは昔はひっじょーーーーーに残念なクオリティ をしていましたが、今では結構大丈夫みたいです! (最近はちょろっとしか触ってないから良くわry) ● という訳で、趣味で(というか、自分の手に 馴染むモノを)選んでいいかも? 48/53
  • 49. 開発環境とか どんなのがあるのん? ビルドツール編 ● sbt(simple-build-tool) ● Scalaのビルドツールはこれが鉄板 ● 一部では「酢豚」とか「サバト」の愛称で親しまれる ● mavenのpom.xmlをScalaで書く感じだと言ったら 乱暴だろうか… (sbtのディレクトリ構成はmaven準拠で、連携可能) ● Javaもビルドできる ● ファイルの更新を検出して自動的にコンパイルしたり テストコード走らせたりとか 49/53
  • 51. あと最後に ● 魔法少女Scalaちゃん(@scalachan)を 今すぐフォロー! 51/53
  • 53. あと最後に ● 間違えた 一緒にScala やろうぜ! 53/53