読者です 読者をやめる 読者になる 読者になる

Just $ A sandbox

プログラミングと計算機科学とかわいさ

Programming in Scalaを読んでいる時のメモ

Programming in Scala: A Comprehensive Step-by-Step Guide, Third Edition (English Edition)

Programming in Scala: A Comprehensive Step-by-Step Guide, Third Edition (English Edition)

を読んでいる時に気になったことをメモします.
2nd Editionなので若干内容が古いやつっぽいのと本文はかなり飛ばし読みしてるので変なことを言っているかも.

疑問が解決したらちゃんと補足していく予定.

Chapter9以前

  • 関数はブロック内の最後の値が戻り値になるっぽい. 慣れないと若干気持ち悪い.
  • (a:A, b:B) => { c:C }ラムダ式みたいなものかな? 便利だしdefとかあんまり要らなさそう.
  • objectはただの名前空間みたいなものだと思って気軽に使っていいのかな?
  • x.f(y)x f yとかけるから中置記法が使えるらしい. 面白いし変なsyntaxと間違う余地がなければかなり便利っぽい.
  • Scalaでは0引数関数と定数の区別が曖昧になっている箇所がある(defの定義のところとか). 要確認.
  • for-exprはforM関数とリスト内包表記を混ぜたみたいな感じ.

Chapter10

  • abstract classは実装もかけるのか.
  • classのパラメータ書くところにprivateとかつけられるの魔剤ンゴ!? 内部ではパラメータは全部ただのvalに置き換わってるからかなあ.
  • classのoverrideとか(おそらくメソッド名等々)の解決はコンパイル時に行われるっぽい
  • finalを付けるとそれを継承したclassやoverrideしたmethodを定義できなくなる. どこで使うのこれ?

Chapter11

  • Javaきもこわちかよらんとこ
  • nullはNull型になっていてValueTypeとはcompatibleじゃない
  • Nothingがbottom

Chapter12

  • traitはそれ自体の値も作れるし継承してクラスを作ることもできる
  • traitはパラメータをもてないのとsuperが動的に解決されるのに注意
  • classより使い勝手よさそう
  • 複数のtraitを継承してmethodが衝突した場合は最後のやつだけが有効
  • reusableならtrait それ以外はabstract classみたいな感じでいいらしい

Chapter15

  • case classというのが作れるらしい. closure conditionをコンパイラに伝えるためのものかな?
  • pattern matchingだ!これで勝つる!
  • valの中身がconstantかどうかまでmatchingの時に判定するので注意
  • _*ワイルドカード任意個の意味になる
  • Anyで受け取ったものをtypeでmatchingもできるらしい. 最高に気持ち悪い.
  • @でmatchした項全体を変数で受け取れる
  • case [pat] if [cond]でpattern guardも使える つよい
  • valの定義やfor-exprの変数定義でpatternを使った束縛もできる

Chapter16

  • List concatは:::
  • foldが/::\なのは流石にヤバくない???

Chapter19

  • subtyping特有のあれこれがあって注意が必要そう
  • S <: T ~> K[S] <: K[T]のようにsubtyping relationを保つときKはこの引数についてcovariantという. 関係が逆になるものをcontravariantという.
  • 型パラメータがcovariant/contravariantであるべきという性質を+A/-Aで要求できる.
  • T >: UでTはUのsupertype, UはTのlower boundであることを要求できる.
  • 「あるクラスを含む全てのクラス」「あるクラスに含まれる全てのクラス」に対する実装を書く(そんなことが本当にあれば)ことができるようになるんだと思う

Chapter20

  • traitの中にはtype/def/val/varをメンバーとして含めることができる
  • member_=でmemberのsetterを定義する. Agdaのmixfix operatorみたいな感じ(完全にmixfixできるの? 多分そんなことはないよね?).
  • lazyを付けると変数の初期化と生成を遅延できる

Chapter21

  • implicit危険なので気をつけよう
  • implicit coercionとimplicit parameterがある
  • <:をimplicit coercion込みで解決してくれるやつは<%とかく
  • この辺使いまくるとコンパイルに時間かかりそう

Chapter28

  • 異なる型の比較とかをうまくやろうとするとそりゃあ大変だよねって話. そもそもそういうことが起こること自体なんか変なのでは?と思うけど
  • subtypingの事情があるのは分かるけど、そんなに何でもかんでも同一視することが大事なのかはよく分からない

Chapter30

  • actor便利かよ〜〜〜
  • ここだけ別の資料なりなんなりでちゃんと勉強したほうがよさそう