「Scalaスケーラブルプログラミング」3章

所感

  • 理解
    • Arrayの要素取り出しは[]ではなく()
      • X(Y)X.apply(Y)の省略形
      • X(Y) = ZX.update(Y, Z)と同値
    • 演算子はない.メソッドである..()なしでも引数が一つならば演算子のように書かれる
    • Arrayが変更可能,Listが変更不可能
    • 普通は左のオブジェクトのメソッド,:が最後にあると,右のオブジェクトのメソッド
    • Listのappend, extendは ::, :::で実現,dropなど含め全て新しいリストを返すメソッド.
      • appendと言っても末尾に追加はサポートしていない
    • タプルはZ = (X, Y)で,アクセスがZ._1, Z._2と1始まり
      • ()ではないのにも納得.返す型が違う可能性があるのでメソッドとして考えられない
    • var, valは変数の変更について, mutable, immutableはオブジェクトの変更についてを規定する
    • デフォルトはimmutable … 問題が起こりにくい
    • 関数型プログラミング => varを使わない, 返り値がUnitでない
    • 関数型プログラミングが絶対ではない
  • 補足

    • List(List(1,2), 3, 4)のようなListを作成可能,List[Any]となる
      • List[1]とした場合型はIntではなくAnyになっている
      • テキストではListではできないということが書いてあったからバージョン変更でサポートされた?もしくはAnyというのが型チェックで落ちるように思われるので,現実的にサポートされているといえないということか.
    • var, valは変数の変更について, mutable, immutableはオブジェクトの変更についてを規定する
      • mutable Set, immutable Setについて,var, valで要素の追加が可能かを確認
        • immutable, var -> OK += が,immutableの場合,同じ変数への代入.varなのでOK
        • immutable, val -> NG valで同じ変数を別オブジェクトで置き換えを禁止される
        • mutable, * -> OK mutableな場合,オブジェクト自体を更新.valでもOK
  • 分からなかった

    • valで定義しても,オブジェクトの内部変数は変更可能 とするとなんのためのvalなのか
      • 例えばfor文の要素要素で処理を書くとして,処理ごとに 独立である変数であることが大事?変更可能とは関係なく.
    • List(1,2,3).count(s => s > 3)のような表現のルールの一貫性 (関数定義と一緒だが...)
    • immutableなSetでも,varであれば要素の追加が出来ている,valにすると出来なかった
    • 最後のファイル読み込みの例はreduceLeftとかいまいちに見える.文字数計算しておいて最後にmaxを取りたい. ただ,関数型でやりたいとするとfor文のそれぞれ結果をどう取り出すかを学ばねばならない.