Java から Scala へ  第2回 関数型言語勉強会 大阪       2012-11-24
木虎 直樹 @kitora_naokiシナジーマーケティング株式会社プログラマ & インフラエンジニアJava, Scala, JavaScript, PythonLinux, Web, AP, RDBMS, MTA, DNS, network...
対象関数プログラミング関数型言語に興味があるが触ったことはないまたは少し触ったことがある
初心者向け厳密な正確性よりもわかりやすさを優先
プログラミングパラダイム命令型プログラミング関数プログラミング論理プログラミングオブジェクト指向プログラミング
関数プログラミングとは狭義変更可能 (mutable) な変数、(再) 代入、ループ等の命令型の制御構造を使わずにプログラミングすること広義関数を中心にプログラミングすること
関数プログラミングの関数とは命令型プログラミングにおける関数ではなく、数学でいうところの関数y = f(x)入力 x に対して出力 y のただ一つの値を決定する規則が与えられているときに y を x の関数という
なぜ関数プログラミング?コードが簡潔になることが多いUnit テストがしやすい(再) 代入がないので、バグの大きな原因の一つがなくなる  特に並列処理数学的な扱いが容易 関数の合成 式変形
関数型言語関数プログラミングをしやすくする特徴をもつプログラミング言語
オブジェクト指向言語と関数型言語の特徴を統合したマルチパラダイムのプログラミング言語JVM 上で動作し、既存の Javaのプログラムと容易に連携可能
高速に動作実績が多い信頼性の高いライブラリが豊富
お手軽さに欠けるpublic	 class	 Main	 {	 	 public	 static	 void	 main(String[]	 args)	 {	 	 	 	 System.out.println("Hello,	 World!"...
Java よりもお手軽hello.scalaprintln("Hello,	 World!")$	 scala	 hello.scalaHello,	 World!
REPL$	 scalascala>	 println("Hello,	 World!")Hello,	 World!
Java っぽい手続きもふめるMain.scalaobject	 Main	 {	 	 def	 main(args:	 Array[String])	 {	 	 	 	 println("Hello,	 World!")	 	 }}$	 sc...
型推論Java//	 Java	 6	 以前List<String>	 list	 =	 new	 ArrayList<String>();//	 Java	 7	 以降List<String>	 list	 =	 new	 ArrayList...
型推論Javapublic	 int	 square(int	 x)	 {	 	 return	 x	 *	 x;}Scaladef	 square(x:	 Int)	 =	 x	 *	 x※ただし、原則として戻り値の型を明示的に宣言することを...
Java Bean とかpublic	 class	 Person	 {	 	 private	 String	 name;	 	 private	 int	 age;	 	 public	 Person(String	 name,	 int	...
Java Bean とかcase	 class	 Person(name:	 String,	 age:	 Int)
強力なパターンマッチJava だと数値と Enum, String などのみint	 monthNumber	 =	 0;switch	 (month.toLowerCase())	 {	 	 case	 "january":	 	 	 	 m...
強力なパターンマッチval	 monthNumber	 =	 month.toLowerCase	 match	 {	 	 case	 "january"	 =>	 1	 	 case	 "february"	 =>	 2	 	 ...	 sn...
型付きパターンJavaif	 (x	 instanceof	 String)	 {	 	 return	 ((String)x).length();}	 else	 if	 (x	 instanceof	 Integer)	 {	 	 retu...
パターンガードp	 match	 {	 	 case	 Person(name,	 age)	 if	 age	 >=	 20	 =>	 "adult"	 	 case	 _	 =>	 ""}
正規表現パターンval	 numeral	 =	 "([0-9]+)".rval	 alpha	 =	 "([a-zA-Z]+)".rargs	 match	 {	 	 case	 numeral(n)	 =>	 println("numera...
高階関数関数を引数にしたり、戻り値にしたりする関数def	 using[A](file:	 File)(f:	 Reader	 =>	 A):	 A	 =	 {	 	 val	 r	 =	 new	 FileReader(file)	 	 tr...
高階関数2011年度卒業生の最高得点Javaint	 max	 =	 -1;for	 (Student	 s:	 students)	 {	 	 if	 (s.gradYear	 ==	 2011)	 {	 	 	 	 max	 =	 Math...
高階関数リストの要素から偶数を取り出し並べ替えJavaList<Integer>	 evens	 =	 new	 ArrayList<>();for	 (Integer	 i:	 list)	 {	 	 if	 (i	 %	 2	 ==	 0)...
その他にも…遅延評価並列処理、並行処理強力な型システム暗黙の変数、暗黙的型変換XML リテラルと操作メソッドなどなど
学習リソース  書籍  Scala スケーラブルプログラミング 第2版  基本です  http://www.amazon.co.jp/dp/4844330845  オンライン学習  Functional Programming Principl...
学習リソースチュートリアルA Tour of Scalaオフィシャルのチュートリアルhttp://docs.scala-lang.org/tutorials/tour/tour-of-scala.htmlScala School!Twitter...
学習リソースその他Scala Style Guideコーディング規約http://docs.scala-lang.org/style/Effective ScalaTwitter 社が公開しているベストプラクティス集http://twitter....
IDEIntelliJ IDEA + Scala pluginhttp://www.jetbrains.com/idea/Scala IDEecipse のプラグインhttp://scala-ide.org/Typesafe Scala IDE...
Upcoming SlideShare
Loading in...5
×

第2回関数型言語勉強会 大阪

2,205

Published on

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,205
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
4
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

第2回関数型言語勉強会 大阪

  1. 1. Java から Scala へ 第2回 関数型言語勉強会 大阪 2012-11-24
  2. 2. 木虎 直樹 @kitora_naokiシナジーマーケティング株式会社プログラマ & インフラエンジニアJava, Scala, JavaScript, PythonLinux, Web, AP, RDBMS, MTA, DNS, network自然言語処理、データマイニングアジャイルサムライ読書会 大阪道場主催
  3. 3. 対象関数プログラミング関数型言語に興味があるが触ったことはないまたは少し触ったことがある
  4. 4. 初心者向け厳密な正確性よりもわかりやすさを優先
  5. 5. プログラミングパラダイム命令型プログラミング関数プログラミング論理プログラミングオブジェクト指向プログラミング
  6. 6. 関数プログラミングとは狭義変更可能 (mutable) な変数、(再) 代入、ループ等の命令型の制御構造を使わずにプログラミングすること広義関数を中心にプログラミングすること
  7. 7. 関数プログラミングの関数とは命令型プログラミングにおける関数ではなく、数学でいうところの関数y = f(x)入力 x に対して出力 y のただ一つの値を決定する規則が与えられているときに y を x の関数という
  8. 8. なぜ関数プログラミング?コードが簡潔になることが多いUnit テストがしやすい(再) 代入がないので、バグの大きな原因の一つがなくなる 特に並列処理数学的な扱いが容易 関数の合成 式変形
  9. 9. 関数型言語関数プログラミングをしやすくする特徴をもつプログラミング言語
  10. 10. オブジェクト指向言語と関数型言語の特徴を統合したマルチパラダイムのプログラミング言語JVM 上で動作し、既存の Javaのプログラムと容易に連携可能
  11. 11. 高速に動作実績が多い信頼性の高いライブラリが豊富
  12. 12. お手軽さに欠けるpublic class Main { public static void main(String[] args) { System.out.println("Hello, World!"); } }$ javac Main.java$ java MainHello, World!
  13. 13. Java よりもお手軽hello.scalaprintln("Hello, World!")$ scala hello.scalaHello, World!
  14. 14. REPL$ scalascala> println("Hello, World!")Hello, World!
  15. 15. Java っぽい手続きもふめるMain.scalaobject Main { def main(args: Array[String]) { println("Hello, World!") }}$ scalac Main.scala$ scala MainHello, World!
  16. 16. 型推論Java// Java 6 以前List<String> list = new ArrayList<String>();// Java 7 以降List<String> list = new ArrayList<>();Scalaval list = new ArrayList[String]
  17. 17. 型推論Javapublic int square(int x) { return x * x;}Scaladef square(x: Int) = x * x※ただし、原則として戻り値の型を明示的に宣言することをお勧めします。
  18. 18. Java Bean とかpublic class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } @Override public String toString() { return String.format("Person(%s,%d)", name, age); } ...snip...}
  19. 19. Java Bean とかcase class Person(name: String, age: Int)
  20. 20. 強力なパターンマッチJava だと数値と Enum, String などのみint monthNumber = 0;switch (month.toLowerCase()) { case "january": monthNumber = 1; break; case "february": monthNumber = 2; break; ...
  21. 21. 強力なパターンマッチval monthNumber = month.toLowerCase match { case "january" => 1 case "february" => 2 ... snip ...コンストラクタパターンcase class Person(name: String, age: Int)val p = Person("duke", 17)val name = p match { case Person(name, age) => name case _ => ""}
  22. 22. 型付きパターンJavaif (x instanceof String) { return ((String)x).length();} else if (x instanceof Integer) { return ((Integer)x).intValue();...Scalax match { case s: String => s.length case i: Int => i...
  23. 23. パターンガードp match { case Person(name, age) if age >= 20 => "adult" case _ => ""}
  24. 24. 正規表現パターンval numeral = "([0-9]+)".rval alpha = "([a-zA-Z]+)".rargs match { case numeral(n) => println("numeral: " + n) case alpha(s) => println("alphabet: " + s) case s => println("other: " + s)}
  25. 25. 高階関数関数を引数にしたり、戻り値にしたりする関数def using[A](file: File)(f: Reader => A): A = { val r = new FileReader(file) try { f(r) } finally { r.close }}
  26. 26. 高階関数2011年度卒業生の最高得点Javaint max = -1;for (Student s: students) { if (s.gradYear == 2011) { max = Math.max(max, s.score); }}Scalastudents.filter( s => s.gradYear == 2011).map(s => s.score).max
  27. 27. 高階関数リストの要素から偶数を取り出し並べ替えJavaList<Integer> evens = new ArrayList<>();for (Integer i: list) { if (i % 2 == 0) { evens.add(i); }}Collections.sort(evens);Scalalist.filter(_ % 2 == 0).sortWith(_ < _)
  28. 28. その他にも…遅延評価並列処理、並行処理強力な型システム暗黙の変数、暗黙的型変換XML リテラルと操作メソッドなどなど
  29. 29. 学習リソース 書籍 Scala スケーラブルプログラミング 第2版 基本です http://www.amazon.co.jp/dp/4844330845 オンライン学習 Functional Programming Principles in Scala Odersky 教授直々の講義 https://www.coursera.org/course/progfun
  30. 30. 学習リソースチュートリアルA Tour of Scalaオフィシャルのチュートリアルhttp://docs.scala-lang.org/tutorials/tour/tour-of-scala.htmlScala School!Twitter 社が公開してくれているチュートリアルhttp://twitter.github.com/scala_school/
  31. 31. 学習リソースその他Scala Style Guideコーディング規約http://docs.scala-lang.org/style/Effective ScalaTwitter 社が公開しているベストプラクティス集http://twitter.github.com/effectivescala/
  32. 32. IDEIntelliJ IDEA + Scala pluginhttp://www.jetbrains.com/idea/Scala IDEecipse のプラグインhttp://scala-ide.org/Typesafe Scala IDETypesafe 社が eclipse と Scala IDE をパッケージングhttp://typesafe.com/stack/scala_ide_download
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×