関数型のパラダイムを学んで業務に活かそうということで、以下のドワンゴオリジナルの新卒エンジニア向けの研修資料でScalaを本格的に勉強してみることにした。
dwango.github.io
※Java8でごにょごにょしないのでは、多少趣味でやりたいという意図があるだけです。
どうせなら、Scalaの言語仕様からガッツリ学んで自分のものにしたい。
また、可能な限りGolangとの比較も入れていきます。
学んだことをとにかく走り書きしていきます。
・0xffはInt型→0xは16進数表記。16進数でffは255。 Int型は符号あり 32-ビット 整数
scala> 0xff res1: Int = 255 [http://www16.plala.or.jp/fm677/16hex.htm:title]
・1e308はDouble型→64bit浮動小数点数。
scala> 1e308 res2: Double = 1.0E308
・9223372036854775807LはLong型→特に言及することはなし
scala> 9223372036854775807L res3: Long = 9223372036854775807
・9223372036854775808L→Longの最大値を超える模様。
scala> 9223372036854775808L <console>:1: error: integer number too large 9223372036854775808L
・"\u3042"はString型→Unicodeのコードポイントを与えてあげると、自動的に文字列変換される模様。Scalaでも、コードポイントが 16ビットに収まらない文字は以下みたいな感じでサロゲートペア で指定する必要がある。
scala> "\uD840\uDC0B" res7: String =𠀋はてなブログでは表示されない文字
・%は符号がある際に、言語によって実装が違う。Scalaでの実装は以下のような感じ。
scala> 4 % -3 res11: Int = 1 scala> 4 % 3 res12: Int = 1 scala> -4 % 3 res13: Int = -1 scala> -4 % -3 res14: Int = -1
4 % -3が違和感あるが、Golangでも同じ動き。
The Go Playground
Double型からInt型へのキャスト
scala> 1.1 + 2.2 res15: Double = 3.3000000000000003(誤差) scala> res15.asInstanceOf[Int] res16: Int = 3 scala> res15.toInt res17: Int = 3
Intの範囲超えの場合、オーバーフローしたのに例外が発生しないだと。。
scala> 2147483647 + 1 res18: Int = -2147483648
ちなみにGolangでは、オーバフローした場合は例外を吐きます。
prog.go:8: constant 2147483648 overflows int
Longも同様の模様。言語実装の意図としては、どういう意図があるのだろうか。
scala> 9223372036854775807L + 1 res20: Long = -9223372036854775808
もちろん、Golangは例外発生。
prog.go:8: constant 9223372036854775808 overflows int64
1e308 + 1はあまりに小さい値は無視される模様。
scala> 1e308 + 1 res21: Double = 1.0E308 scala> 1 + 0.0000000000000000001 res22: Double = 1.0
引き算系は直感と変わらず。
scala> 1 - 1 res23: Int = 0 scala> 1 - 0.1 res24: Double = 0.9 scala> 0.1 - 1 res25: Double = -0.9 scala> 0.1 - 0.1 res26: Double = 0.0 scala> 0.0000000000000000001 - 1 res27: Double = -1.0
Golangでも0.1-0.1は0として、表示はされているが、float64型なので、64-ビット浮動小数値でScalaのDouble型と一緒だということがわかる。
The Go Playground
掛け算、割り算系は特に違和感なし。
scala> 0.1 * 0.1 res28: Double = 0.010000000000000002 scala> 20 * 0.1 res29: Double = 2.0 scala> 1 / 3 res30: Int = 0 scala> 1.0 / 3 res31: Double = 0.3333333333333333 scala> 1 / 3.0 res32: Double = 0.3333333333333333 scala> 3.0 / 3.0 res33: Double = 1.0 scala> 1.0 / 10 * 1 / 10 res34: Double = 0.01 scala> 1 / 10 * 1 / 10.0 res35: Double = 0.0
練習問題
Q. ¥3,950,000を年利率2.3%の単利で8か月間借り入れた場合の利息はいくらか(円未満切り捨て)
scala> 3950000 res36: Int = 3950000 scala> 2.3 res37: Double = 2.3 scala> res36 * res37 * 8 /100/12 res38: Double = 60566.666666666664 scala> res38.toInt res39: Int = 60566
Q. 定価¥1,980,000の商品を値引きして販売したところ、原価1.6%にあたる¥26,400の損失となった。割引額は定価の何パーセントであったか
scala> 1980000.0 res40: Double = 1980000.0 scala> 26400.0 * 1000 /16 res41: Double = 1650000.0 //割引額を求める式 定価-原価+損失額 scala> (res40-res41+26400)/res40 res42: Double = 0.18
Programming in Scala: Updated for Scala 2.12
- 作者: Martin Odersky,Lex Spoon,Bill Venners
- 出版社/メーカー: Artima Inc
- 発売日: 2016/05/10
- メディア: ペーパーバック
- この商品を含むブログを見る
Scala関数型デザイン&プログラミング―Scalazコントリビューターによる関数型徹底ガイド
- 作者: Paul Chiusano,Rúnar Bjarnason,株式会社クイープ
- 出版社/メーカー: インプレス
- 発売日: 2015/04/30
- メディア: Kindle版
- この商品を含むブログ (2件) を見る
- 作者: アンドリュー・フィリップス,ネルミン・セリフォヴィック,竹添直樹,島本多可子
- 出版社/メーカー: 翔泳社
- 発売日: 2016/02/05
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
- 作者: デイビッド・ポラック,羽生田栄一,大塚庸史
- 出版社/メーカー: 日経BP社
- 発売日: 2010/03/18
- メディア: 単行本
- 購入: 14人 クリック: 251回
- この商品を含むブログ (31件) を見る