「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文のそれぞれ結果をどう取り出すかを学ばねばならない.

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

所感

  • 納得した点
    • 関数定義で,引数は型が必須,返り値は任意というのは納得. 関数間の不整合は必ずチェック,関数内での不整合は任意.
    • def f(X) = {Y}の関数定義と(X) => Yの関数定義,後者はその場限り なので型を省略してもよいが,前者はだめ.
    • 関数型のスタイル,というところは,反復で並列化するときに 処理がvarを通して依存しているのではなく,全部独立になっている からよいのだという意味で納得した.
  • 補足
    • Scalaインタープリタではなくjupyter-scalaで試してみている
    • valは上書き不能,varは上書き可能
    • defで定義した関数オブジェクトはvalになっており,変更不可.
  • 分からなかった点
    • valとvarがわざわざ分かれているが,どこでvalを使うべきなのかを理解しないと varばかり使ってしまいそうだがそれは間違いなはず.
    • jupyter-scalaのindentがScalaで推奨されているものと異なって しまっているのでなんとかしたい

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

所感

  • Scalaの長所や狙いについて,概念はわかるが本質を実感できているのは半分もないと思う. でもそんなものと思ってまずは読み進める.
  • 共感する点
    • 並列計算で問題が起こらないように制約を課すというアプローチ
    • 副作用禁止
    • 簡潔性: 制約を課してエラーが起こりにくい形に制限していると期待
    • 静的な型: 複雑なアルゴリズムでは指定すべきと思う
  • まだ共感できない/わからなかった点
    • プログラム内の操作は,データの書き換えではなく写像であるべき
      • 確かに混乱した経験はあるがappendなどもそうすべき?
    • 新しい制御構造を作れる言語 … それって普通なことでは?と思ってしまう. 機能が実現できるのは普通だが言語としての見え方がよくなるのだろうか.

つまづいた概念

  • スレッドセーフ
    • コードに対して,並列に計算しても大丈夫であるという性質のこと
    • Map(PythonでいうDictionary)の例: 並列処理で更新されると確かに変になりそう
  • リテラル
    • 定数のこと
    • 整数リテラル,というと,整数とみなされる定数のこと

設定

  • PythonユーザがScalaを学習
  • 以下で構築した環境でテストする

github.com

  • 教科書は以下を利用.ずいぶん昔に買って放っておいたものを今更読むので,初版のもの.

https://www.amazon.co.jp/Scala%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%A9%E3%83%96%E3%83%AB%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E3%82%B3%E3%83%B3%E3%82%BB%E3%83%97%E3%83%88-%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0-Programming-Scala/dp/4844327453www.amazon.co.jp