ScalaMatsuri2018 3日目 メモ
Scala Matsuri 2018 の 3 日目。この日はアンカンファレンス形式だった。
結局圏論が理解出来なかった俺達の復習
圏論の話。 圏論を学ぶ理由として、「抽象」の見方が変わるという話があった。
- proper value -> 即値みたいなもの
- first order value ->
\x -> x + 1
- OR function
high order value(function)
圏論がなぜ良く出てくるか
- 上記のものを型でやる
proper type = 値を入れることができるもの
- 型コンストラクタ = 1 order kinded type
- 型は
- 数学的には「*」と書くことが多い
- Scala 的には「A」とだけ書いたり
- Option の型
- F[A]
* -> *
- Either
F[A1, A2]
- `* -> * -> *
- Functor
- `( -> ) -> *``
- 高カインド型
- 型コンストラクタを受け取る型コンストラクタ
F[G[A]]
- 型は
- Scala は higher kinded type を扱えるので、より関数型言語っぽいことができる
- See 型システム入門
- parametricity -> 多相性のひとつ?
- 圏論を学ぶ理由
- Product, 積 -> tuple, Co Product, 余積 -> Either
依存型プログラミング入門
- 次の点でHaskell と違う
- default eager evauation
- type annotation
- etc
- 機能
- Dependent type
- Type depends on value 型の中に値を持っている
- types are first class
- Proof with dependent type
Idris 入門
- Vect 型
- list which contains number of elements in this type
Vect n a
- n: number of elements
- a: type of elment
Vect : Nat -> Type -> Type
Nil : Vect 0 elem
Vect に対する tail 関数は次のようになる
my_vect_tail : Vect (S n) a -> Vect n a my_vect_tail (x :: xs) = xs
Vect に対する zip 関数は次のようになる
my_vect_zip : Vect n a -> Vect n b -> Vect n (a,b) my_vect_zip [] [] = [] my_vect_zip (x :: xs) ( y :: ys) = (x,y) :: my_vect_zip xs ys
これだけで定義完了。 長さが等しいことをコンパイラがしっている
index 関数
my_index : Fin len -> Vect len elem -> elem my_index FZ (x::xs) = x my_index FS (x::xs) = index k xs
Fin len
とすると、 0 以上 len 未満になるmy_index
never fail
実際に my_vect_zip
を呼ぶ際には、ユーザ側で引数のVect
同士の長さが等しいことを示してあげる必要がある
ここらへんあまり追えてないが、EqNat
というものを使ってどうにかしていた。
data EqNat : (num1 : Nat) -> (num2 : Nat) -> Type where Same: (num : Nat) -> EqNat num num
- EqNat のコンストラクタは Same のみ
- Same では型引数はひとつしかない。
- -> EqNat の型引数 num1 と num2 は同じもの
以上のような自分でzip
関数を書いてみるのはチュートリアルのなかであるらしい。
実践ScalaでDDD(改訂版) @crossroad0201
Scala での DDD の話。
たこ焼き屋に並んでたため、途中からしか見てない…
- データと動作を分離させる
- implicit で動作を分離させる
- コーディング
- 名前をちゃんとつける
- prefix で型を知らせる (ex.
maybeUser
で option に包んだ User とか) - formatter を使う
- レイヤー
- 依存性の逆転を使う
- Onion Architecture
- Clean Archiitecture, Hexagonal Architecture
- 原理は一緒(と思われる)
- Error Handling
- 例外は基本使わない。 Option を使う
DDD compmonents by Scala
- Application Service
- Entity
- 1 Entity in 1 Aggregation
- Value Objects
- type alias
- extens AnyValue
- Role
- DDD にはないモデル
- リレーションを拡張する仕組み
- 例えば、ユーザにたいして Author という関係が惹かれていた場合、 User にメソッドを入れるのではなく、Author とうロールを作って、 そこにメソッドを追加したい
- implicit でうまくやる
Scala Design Patterns @gakuzzzz
- Builder Pattern → Scala では必要なし
- 条件に合わない初期化をコンパイルエラーにする Type-safe Builder Pattern は finagle とかで使われている
- Concept Pattern → 型クラス
- Loan Pattern
- リソースのクローズなど、処理忘れをしたくない時にやる
- 言語機構としては try, finally
- リソースのクローズなど、処理忘れをしたくない時にやる
- a la carte import
- Aux パターン
あと3日でJava 10がリリースですが、興味ある人いますか?
Java 10 の話。
Java 10 はとりあえずいれてみた。 Docker aware になるのは 10 からで、それまでどうやってたか気になって調べたが、cpu を指定するオプションがあるもよう。
Dottyの新機能 @amaya382
Dottyの話。型推論が賢くなるのはいいね。