Scala超入門

SparkのとっかかりとしてたぶんSparkの入門的なものであるAMPCampをさらってみています。

とりあえず、prerequireにあったScalaの超入門的なものをやりました。SparkはPythonでも動かせますが、真面目にやるにあたってはScalaは避けて通れませんので、当面はその辺りの勉強も必要ですね。

例ではScalaShellで動かしていましたが、Scala自体もほぼ初心者なので勉強を兼ねてソースコード化して動かしてみました。 Scalaはまだコップ本を読みつつなので、全然手に馴染んでないし、関数型っぽくうまく書けずまだまだだなぁ、と。2年くらい前にSICPの読書会に参加していた記憶よよみがえれ!

import scala.io.Source

object Intro {
  // 3. cubeというInt型の値の3乗を計算する関数を定義
  def cube(n: Int): Int = n * n * n

  // 6. 階乗を計算する関数を定義する。ループも再帰も使えるが、ここでは再帰を使う
  def factorial(n: Int): Int = {
    if (n == 0) 1 else n * factorial(n-1)
  } 
  
  // ボーナス:ワードカウントの実装
  // まだ良くわかっていないので答えをみた
  // mutableなHashMap使っているのでScalaらしくはない
  def wordcount(source: String): collection.mutable.Map[String, Int] = {
    val lines = Source.fromFile(source).getLines.toArray
    val counts = new collection.mutable.HashMap[String, Int].withDefaultValue(0)
    lines.flatMap(line => line.split(" ")).foreach(word => counts(word) += 1)
    return counts
  } 

  def main(args: Array[String]) {
    // 2. myNumberというInt型のリストを定義
    val myNumbers = List(1, 2, 3, 4, 5)
    
    // 4. 定義した関数をmyNumbersに提供する
    myNumbers.map(x => cube(x))
    // myNumbers.map(cube) こっちのほうがscalaっぽい?
    
    // 5. 関数リテラル使って3,4と同じことを実現
    myNumbers.map(x => x * x * x)

    // 6. 階乗を計算する関数を定義する。ループも再帰も使えるが、ここでは再帰を使う
    // factorialの定義は上部にて
    println(myNumbers.map(factorial))
    
    // ボーナス:wordcountの実装
    // sparkのREADME.mdをカレントディレクトリに持ってきた
    println(wordcount("README.md"))
  }
}