giantneco’s blog

技術メモ

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

依存型プログラミング入門

Idris は Haskell ベースの関数型言語で、

  • 次の点で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

Scala でのデザインパターンの話。

  • 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の話。型推論が賢くなるのはいいね。