際際滷

際際滷Share a Scribd company logo
15蛍でざっくり蛍かる皆界温鉛温秘壇
恃儲 v匯隻 JAIST IS 2014/6/21 kanazawa.rb meetup#22
1
徭失B初
2
? 恃儲 v匯隻
? 臼枠極親僥室g寄僥垪寄僥
秤鷽苫а仂真 鴬平瘁豚2定
? 繁垢岑嬬恬ってます
Scalaのいいところ
3
? JVM貧で咾
Javaのライブラリ
Java喘のフレ`ムワ`クなどにMみzめる
? オブジェクト峺鬘v方侏
? きれいなJava
? 繁議には是ったrはJavaっぽくけるし、Lispっぽくも
けるし挫き
Scala壼燕 リテラル
4
Scala Java
Int int
Long long
Double double
Boolean boolean
String String
Tuple
Elem(xml)
その麿Javaにあるものはある
val x : Int = 1
var str : String = ^hoge ̄
val tuple = (1, ^hoge ̄)
val xml = <xml><body>text</body></xml>
val 壅旗秘音辛
できるだけこっちを聞う
var 壅旗秘できる
できるだけ聞わない
Scala壼燕 崙囮猟
5
Scala Java
if (i < 10) { ´ } else { ´ } if (i < 10) { ´ } else { ´ }
while(i < 10){ ´ } while(i < 10) { ´ }
for(o : Object <- list) { ´ } for(Object o : list) { ´ }
n match {
case 1 => ´
case 2 => ´
case _ => ´
}
switch(n) {
case 1 : ´ break;
case 2 : ´ break;
default : ´ break;
}
if猟塀は、魴気
val x = 1 + (if (true) 3 else 4)
->x : Int = 4
for猟塀も、魴気擦
val list = for(i <- 1 to 10; if i % 3 == 0) yield i
->list = Vector(3,6,9)
Scala壼燕 v方
6
Scala Java
def public
private def private
Unit void
return(福待辛) return
コンパニオンオブジェクトで旗喘 static
override @Override
(arg0 : Type0, arg1 :Type1) => { ´ } (Type0 arg0, Type1 arg1) -> { ´ }
tlist : Type* Type´ tlist
def inc(x : Int): Int = x + 1
private def positive(ls : List[Int]):List[Int] = {
ls foreach { print(_) }
ls filter (i => 0 < i)
}
Scala壼燕 オブジェクト峺
7
Scala Java
class class
abstract abstract
trait(ただしg廾を隔てる) interface
final final
extends extends
with implements
[A] <A>
[A <: B] A extends B
[A >: B] A super B
package package
import import
これくらい蛍かれば、ざっくりScalaはける
フィボナッチ方双
8
0, 1, 1, 2, 3, 5, 8, 13, ´
0と1から兵まって、あとは念の2つを怎してできる方双
v方侏プログラミングの秘Tでおなじみ
ヒマワリのNのつきかたとかが
フィボナッチ方双らしい
Javaっぽいg廾
9
def fib(n : Int): BigInt = {
if (n <= 0) return 0
if (n == 1) return 1
var n1 = BigInt(0)
var result = BigInt(1)
for(i <- 2 to n) {
val tmp = result
result += n1
n1 = tmp
}
return result
}
これはn-1桑朕
これを
n桑朕
とすると
これはn-2桑朕
辛i來 拭 g佩堀業 $
g佩すると
for(i <- 0 to 100) print(fib(i)+",")
->0,1,1,2,3,5,8,13,21,34,55,´
v方侏っぽいg廾
10
def fib(n : Int): BigInt =
n match {
case n if n <= 0 => 0
case 1 => 1
case _ => fib(n - 1) + fib(n - 2)
}
fib(100) -> Kわらない
辛i來 £、 g佩堀業 〜
nが0參和の栽ここにマッチ
nが0參和でも1でもないなら、念2つを怎したもの
方僥議な協xそのまま
挑硫壅「
11
def fib(n : Int): BigInt = {
if (n <= 0) return 0
def rec(i : Int, n1 : BigInt, result : BigInt):BigInt =
i match {
case i if n <= i => result
case _ => rec(i + 1, result, result + n1)
}
rec(1, 0, 1)
}
辛i來 $、 g佩堀業 $
v方坪で壅「v方を協x
カウンタ
ル`プを指りきったら軸
麻Y惚を卦す
v方に局す念に麻しておく
varとかvalとかなくてもプログラムはける
オブジェクトプログラミング1
12
case class Person(val first_name : String,
middle_name : Option[String], last_name : String) {
def fullName: String =
middle_name match {
case Some(md : String) =>
first_name +" "+md+" "+last_name
case None => first_name+" "+last_name
}
def marryWith(person : Person): Person =
new Person(first_name, person.middle_name,
person.last_name)
}
Option侏nullの辛嬬來がある、魄むモナド
caseクラスequals()やhashCode()などを徭咾牌ってくれる
オブジェクトプログラミング2
13
object Person {
def apply(first_name : String, last_name : String): Person =
new Person(first_name, None, last_name)
def sasakiFamily(first_name : String): Person =
new Person(first_name, None, ^Sasaki ̄)
}
val mika = Person.sasakiFamily(^Mika ̄)
コンパニオンオブジェクト困海海剖xされたv方はstatic
ファクトリ`みたいなもの
オブジェクトプログラミング3
14
val taro = Person.sasakiFamily("Taro")
val hana = Person("Hana", "Tanaka")
println(hana.fullName)
val sasaki_hana = hana marryWith taro
println(sasaki_hana.fullName)
-> ̄Hana Tanaka ̄
^Hana Sasaki ̄
. とか () とか福待できる
15
JavaっぽくO
v方侏っぽく嶄附をg廾
あとは
これでざっくりScalaける
JavaにはoいC嬬
16
クロ`ジャ
17
def labelMaker(str : String): Unit => String = {
var i = 0
Unit => {
i += 1
str + i }}
val argMaker = labelMaker("arg")
for(i <- 1 to 3) print(argMaker()+",")
->arg1,arg2,arg3,
り、緑佑v方
哈方で嚥えられた猟忖双
クロ`ジャ坪に隠贋されている篳この
v方が
「る
クロ`ジャでフィボナッチ
18
def fib(n : Int): BigInt = {
val memo ={
var n1 = BigInt(1)
(x : BigInt) => {
var tmp = n1
n1 = x
tmp }}
var result = BigInt(0)
for(i <- 1 to n) result += memo(result)
result
}
哈方で嚥えられた方を隠贋し、
念指隠贋した方を卦すv方
v方の何蛍m喘
19
def sandwich
(header : String)(fooder : String)(body : String): String =
header + body + fooder
def htmlMaker(tag : String)(body : String): String =
sandwich("<" + tag + ">")("</" + tag + ">")(body)
val commentout = sandwich("<!-- ")(" -->")_
val ptag = htmlMaker("p")_
println(commentout(^here is a text "))
List("hoge","goo","foo") map ptag foreach print
-><!C here is a text -->
<p>hoge</p><p>goo</p><p>foo</p>
3つ朕の哈方はまだ嚥えない
瘁から3つ朕の哈方を嚥える
採業でも聞える
哈方のカッコを曝俳る
何蛍m喘でフィボナッチ
20
def fib(n : Int): BigInt = {
def add(n1 : BigInt)(n2 : BigInt): BigInt = n1 + n2
def rec(i : Int, add_memo : BigInt => BigInt,
result : BigInt): BigInt =
i match {
case i if n <= i => result
case _ => rec(i+1, add(result), add_memo(result))
}
rec(0, add(BigInt(1)), BigInt(0))
}
繁議にはこれが匯桑かな
方をとってresultを怎すv方
えていた方にresultを怎す
圧aの侏Q
21
class ExtString(val str: String) {
def -(str2 : ExtString): ExtString = new ExtString(str.replace(str2.str, ""))
def *(str2 : String): List[String] =
for(s <- this.allSubstring; t <- new ExtString(str2).allSubstring)
yield s + t
def allSubstring: List[String] = { ´ }
override def toString(): String = str
}
object ExtString {
implicit def string2ExtString(str : String) = new ExtString(str)
}
import ExtString._
println("hoge" - "og")
"wnzk" * "a" filter(_.length == 2) foreach {print(_)}
-> ̄he ̄
^ka ̄ ̄na ̄ ̄za ̄ ̄wa ̄
リテラルを徭喇にできる
Stringには C や * などoい
ExtStringにはあるから、
StringからExtStringへQする
Qtを協xしておけばいい
猟忖双の畠宥りのM
o泪螢好箸妊侫ボナッチ
22
lazy val fib: Stream[BigInt] =
Stream.cons(0,
Stream.cons(1, fib.zip(fib.tail).map(p => p._1 + p._2)))
(0,1,1,2,3,5,8,´
o泪螢好
(1,1,2,3,5,8,´
((0,1),(1,1),(1,2),(2,3),(3,5),(5,8),´
zip
タプルの勣殆を怎す
(1,2,3,5,8,13´ フィボナッチ方双
ちなみに ベンチマ`ク
23
1,000 10,000 100,000 500,000
Javaっぽい 5 20 223 4415
挑硫壅「 3 4 182 4501
クロ`ジャ 4 8 186 4401
何蛍m喘 2 6 187 4703
o泪螢好 28 69 OutOfMemoryError OutOfMemoryError
-Xmx 1024 -Xms 1024 でfib(n)を麻するのにかかるrg┘潺蠱襭

More Related Content

15蛍でざっくり蛍かる皆界温鉛温秘壇

  • 2. 徭失B初 2 ? 恃儲 v匯隻 ? 臼枠極親僥室g寄僥垪寄僥 秤鷽苫а仂真 鴬平瘁豚2定 ? 繁垢岑嬬恬ってます
  • 3. Scalaのいいところ 3 ? JVM貧で咾 Javaのライブラリ Java喘のフレ`ムワ`クなどにMみzめる ? オブジェクト峺鬘v方侏 ? きれいなJava ? 繁議には是ったrはJavaっぽくけるし、Lispっぽくも けるし挫き
  • 4. Scala壼燕 リテラル 4 Scala Java Int int Long long Double double Boolean boolean String String Tuple Elem(xml) その麿Javaにあるものはある val x : Int = 1 var str : String = ^hoge ̄ val tuple = (1, ^hoge ̄) val xml = <xml><body>text</body></xml> val 壅旗秘音辛 できるだけこっちを聞う var 壅旗秘できる できるだけ聞わない
  • 5. Scala壼燕 崙囮猟 5 Scala Java if (i < 10) { ´ } else { ´ } if (i < 10) { ´ } else { ´ } while(i < 10){ ´ } while(i < 10) { ´ } for(o : Object <- list) { ´ } for(Object o : list) { ´ } n match { case 1 => ´ case 2 => ´ case _ => ´ } switch(n) { case 1 : ´ break; case 2 : ´ break; default : ´ break; } if猟塀は、魴気 val x = 1 + (if (true) 3 else 4) ->x : Int = 4 for猟塀も、魴気擦 val list = for(i <- 1 to 10; if i % 3 == 0) yield i ->list = Vector(3,6,9)
  • 6. Scala壼燕 v方 6 Scala Java def public private def private Unit void return(福待辛) return コンパニオンオブジェクトで旗喘 static override @Override (arg0 : Type0, arg1 :Type1) => { ´ } (Type0 arg0, Type1 arg1) -> { ´ } tlist : Type* Type´ tlist def inc(x : Int): Int = x + 1 private def positive(ls : List[Int]):List[Int] = { ls foreach { print(_) } ls filter (i => 0 < i) }
  • 7. Scala壼燕 オブジェクト峺 7 Scala Java class class abstract abstract trait(ただしg廾を隔てる) interface final final extends extends with implements [A] <A> [A <: B] A extends B [A >: B] A super B package package import import これくらい蛍かれば、ざっくりScalaはける
  • 8. フィボナッチ方双 8 0, 1, 1, 2, 3, 5, 8, 13, ´ 0と1から兵まって、あとは念の2つを怎してできる方双 v方侏プログラミングの秘Tでおなじみ ヒマワリのNのつきかたとかが フィボナッチ方双らしい
  • 9. Javaっぽいg廾 9 def fib(n : Int): BigInt = { if (n <= 0) return 0 if (n == 1) return 1 var n1 = BigInt(0) var result = BigInt(1) for(i <- 2 to n) { val tmp = result result += n1 n1 = tmp } return result } これはn-1桑朕 これを n桑朕 とすると これはn-2桑朕 辛i來 拭 g佩堀業 $ g佩すると for(i <- 0 to 100) print(fib(i)+",") ->0,1,1,2,3,5,8,13,21,34,55,´
  • 10. v方侏っぽいg廾 10 def fib(n : Int): BigInt = n match { case n if n <= 0 => 0 case 1 => 1 case _ => fib(n - 1) + fib(n - 2) } fib(100) -> Kわらない 辛i來 £、 g佩堀業 〜 nが0參和の栽ここにマッチ nが0參和でも1でもないなら、念2つを怎したもの 方僥議な協xそのまま
  • 11. 挑硫壅「 11 def fib(n : Int): BigInt = { if (n <= 0) return 0 def rec(i : Int, n1 : BigInt, result : BigInt):BigInt = i match { case i if n <= i => result case _ => rec(i + 1, result, result + n1) } rec(1, 0, 1) } 辛i來 $、 g佩堀業 $ v方坪で壅「v方を協x カウンタ ル`プを指りきったら軸 麻Y惚を卦す v方に局す念に麻しておく varとかvalとかなくてもプログラムはける
  • 12. オブジェクトプログラミング1 12 case class Person(val first_name : String, middle_name : Option[String], last_name : String) { def fullName: String = middle_name match { case Some(md : String) => first_name +" "+md+" "+last_name case None => first_name+" "+last_name } def marryWith(person : Person): Person = new Person(first_name, person.middle_name, person.last_name) } Option侏nullの辛嬬來がある、魄むモナド caseクラスequals()やhashCode()などを徭咾牌ってくれる
  • 13. オブジェクトプログラミング2 13 object Person { def apply(first_name : String, last_name : String): Person = new Person(first_name, None, last_name) def sasakiFamily(first_name : String): Person = new Person(first_name, None, ^Sasaki ̄) } val mika = Person.sasakiFamily(^Mika ̄) コンパニオンオブジェクト困海海剖xされたv方はstatic ファクトリ`みたいなもの
  • 14. オブジェクトプログラミング3 14 val taro = Person.sasakiFamily("Taro") val hana = Person("Hana", "Tanaka") println(hana.fullName) val sasaki_hana = hana marryWith taro println(sasaki_hana.fullName) -> ̄Hana Tanaka ̄ ^Hana Sasaki ̄ . とか () とか福待できる
  • 17. クロ`ジャ 17 def labelMaker(str : String): Unit => String = { var i = 0 Unit => { i += 1 str + i }} val argMaker = labelMaker("arg") for(i <- 1 to 3) print(argMaker()+",") ->arg1,arg2,arg3, り、緑佑v方 哈方で嚥えられた猟忖双 クロ`ジャ坪に隠贋されている篳この v方が 「る
  • 18. クロ`ジャでフィボナッチ 18 def fib(n : Int): BigInt = { val memo ={ var n1 = BigInt(1) (x : BigInt) => { var tmp = n1 n1 = x tmp }} var result = BigInt(0) for(i <- 1 to n) result += memo(result) result } 哈方で嚥えられた方を隠贋し、 念指隠贋した方を卦すv方
  • 19. v方の何蛍m喘 19 def sandwich (header : String)(fooder : String)(body : String): String = header + body + fooder def htmlMaker(tag : String)(body : String): String = sandwich("<" + tag + ">")("</" + tag + ">")(body) val commentout = sandwich("<!-- ")(" -->")_ val ptag = htmlMaker("p")_ println(commentout(^here is a text ")) List("hoge","goo","foo") map ptag foreach print -><!C here is a text --> <p>hoge</p><p>goo</p><p>foo</p> 3つ朕の哈方はまだ嚥えない 瘁から3つ朕の哈方を嚥える 採業でも聞える 哈方のカッコを曝俳る
  • 20. 何蛍m喘でフィボナッチ 20 def fib(n : Int): BigInt = { def add(n1 : BigInt)(n2 : BigInt): BigInt = n1 + n2 def rec(i : Int, add_memo : BigInt => BigInt, result : BigInt): BigInt = i match { case i if n <= i => result case _ => rec(i+1, add(result), add_memo(result)) } rec(0, add(BigInt(1)), BigInt(0)) } 繁議にはこれが匯桑かな 方をとってresultを怎すv方 えていた方にresultを怎す
  • 21. 圧aの侏Q 21 class ExtString(val str: String) { def -(str2 : ExtString): ExtString = new ExtString(str.replace(str2.str, "")) def *(str2 : String): List[String] = for(s <- this.allSubstring; t <- new ExtString(str2).allSubstring) yield s + t def allSubstring: List[String] = { ´ } override def toString(): String = str } object ExtString { implicit def string2ExtString(str : String) = new ExtString(str) } import ExtString._ println("hoge" - "og") "wnzk" * "a" filter(_.length == 2) foreach {print(_)} -> ̄he ̄ ^ka ̄ ̄na ̄ ̄za ̄ ̄wa ̄ リテラルを徭喇にできる Stringには C や * などoい ExtStringにはあるから、 StringからExtStringへQする Qtを協xしておけばいい 猟忖双の畠宥りのM
  • 22. o泪螢好箸妊侫ボナッチ 22 lazy val fib: Stream[BigInt] = Stream.cons(0, Stream.cons(1, fib.zip(fib.tail).map(p => p._1 + p._2))) (0,1,1,2,3,5,8,´ o泪螢好 (1,1,2,3,5,8,´ ((0,1),(1,1),(1,2),(2,3),(3,5),(5,8),´ zip タプルの勣殆を怎す (1,2,3,5,8,13´ フィボナッチ方双
  • 23. ちなみに ベンチマ`ク 23 1,000 10,000 100,000 500,000 Javaっぽい 5 20 223 4415 挑硫壅「 3 4 182 4501 クロ`ジャ 4 8 186 4401 何蛍m喘 2 6 187 4703 o泪螢好 28 69 OutOfMemoryError OutOfMemoryError -Xmx 1024 -Xms 1024 でfib(n)を麻するのにかかるrg┘潺蠱襭