( ꒪⌓꒪) ゆるよろ日記

( ゚∀゚)o彡°オパーイ!オパーイ! ( ;゚皿゚)ノシΣ フィンギィィーーッ!!!

Scalaプログラマレベル(アプリケーション/ライブラリ)[翻訳]

Scalaの難易度とか学習曲線について、最近また議論されてるようですが、公式にはこのようなレベル分けになってますよ。

Scala levels: beginner to expert, application programmer to library designer | The Scala Programming Language


アプリケーションプログラマとライブラリプログラマに別れてます。アプリケーションプログラマLv2とライブラリプログラマLv1が大体同じくらいの習熟度だそうです。
なんか、これ見ると中級アプリケーションプログラマくらいならすぐになれますよね。


Scala簡単だワー。Q.E.D

Level A1: 初級アプリケーションプログラマ(Beginning application programmer)

  • Javaのような式や文を利用できる。標準的な演算子やメソッド呼び出し、条件分岐、ループ、try/catch。
  • class, object, def, val, var, import, package
  • メソッド呼び出しで中置記法を使える
  • 簡単なクロージャの利用
  • コレクションでmap, filterなどを扱える
  • for内包表記

Level A2: 中級アプリケーションプログラマ(Intermediate application programmer)

  • パターンマッチング
  • Traitを組み合わせることができる
  • 再帰、特に末尾再帰に対する理解
  • XMLリテラル

Level A3: 特級アプリケーションプログラマ(Expert application programmer)

  • 畳み込み関数(fold)。例えば、foldLeft, foldRightなど
  • Streamとその他遅延データ構造を適切に扱える
  • Actors
  • パーサコンビネータ

Level L1: 下級ライブラリ設計者(Junior library designer0

  • 型パラメータ
  • Trait
  • 遅延評価(lazy val)
  • カリー化を利用した抽象化された制御構造
  • 名前渡しパラメータ(By-name parameters)

Level L2: 上級ライブラリ設計者(Senior library designer)

  • 変異指定アノテーション(Variance annotations)を利用した共変/反変なジェネリック
  • 存在型(Existential types)。例えば、Javaワイルドカードへのインターフェースとして
  • Self type annotations とcake patternを利用したdependency injection
  • 構造的部分型(Structural types)。例えば、静的なduck-typingなど
  • map/flatmap/withFilterを新しく定義することによるfor内包表記への対応
  • 抽出子(Extractors)

Level L3: 特級イブラリ設計者(Expert library designer)

  • 事前定義(Early initializers)
  • 抽象型(Abstract types)
  • 暗黙の定義(implicit conversion/implicit parameter)
  • 高階型引数(Higher-kinded types)