2019-08-24: Generic1を実装した
やったこと
Scala
念願のGeneric1を実装した。
わりと動く。例えばscala標準のEitherなんかはシンプルなのでFunctorの導出までできたりする。
ちなみにGenericで変換できる型は次の通り:
- 任意の
object XはインスタンスGeneric.Aux[X, HNil]が導出される。 - 任意の
case class X(p1: T1, p2: T2, ..., pn: Tn)はGeneric.Aux[X, T1 :*: T2 :*: ... :*: HNil]が導出される。 sealedな型X[A1, A2, ..., An]について、既知の子クラスS1, S2, ..., SmがXと同じ数の型引数を持っていて、そのままの順番でXに渡しているような場合に、
(S1[A1, A2, ..., An] extends X[A1, A2, ..., An]となっているということ)
Generic.Aux[X, S1 :+: S2 :+: ... :+: Sm]が導出される。
最後のケースが分かりづらいのだけど、そもそもScalaでADTをやるのがしんどい部分があるので仕方ない。
なおこの定義だとListのインスタンスが導出できない。
というのもobject Nil extends List[Nothing]なので型引数の数が異なってしまっている。
型引数の数が同じな必要があるのはGADT的なのを弾くためなのだけど、Listの場合は型引数が共変なので問題なく扱えるはずではある。
けど、これを対応すべきかというと微妙なところだよなぁ、という気もする。労力に合わない。普通にこんな風に定義してほしい。
sealed abstract class MyList[+A]
sealed case class MyNil[+A] private () extends MyList[A]
object MyNil extends MyNil[Nothing]
final case class MyCons[+A](head: A, tail: MyList[A]) extends MyList[A]
この辺は難しいところ。
catsの型クラスの自動導出をいくつかやってみて感覚を掴もう。
ミリ
曲は良いのでやる気はあるのだけど時間がない。
ツアー形式でこんなにやってないの久し振りな気がする。
シャニ
完全に放置していたのでフェスイベントを進める。
思い出Maxの千雪さんやっぱ強い‥‥。
完全掌握決めてしまった。
果穂SSRも引いた。
運が良い。
https://twitter.com/make_now_just/status/1165062084205277184
https://twitter.com/make_now_just/status/1165062262861651968
思い出Lv、アップまで残りどれくらいか表示されるようになったんか。
というわけで優勝。決勝でVo1位にならなければ余裕なんだよな。
なにはともあれようやくTrue取れたので満足。
I love cocking良すぎる‥‥。
https://twitter.com/make_now_just/status/1165081216384503808
甘奈True。
S4の最後でミスってSランクを逃したアホ。
七彩難しいよな。
アルストロメリア全員入れてプロデュースしたので気持ちがいい。
https://twitter.com/make_now_just/status/1165113552228646912
フェスイベントはとりあえずイルミネとアルストロメリアを終了。
残り面倒というかMe要因がいないのでつらい。