Map の代数的構造と差分によるプログラミング

どんどん話が面白くなっているので期待しかない。
5
pokarim @pokarim

Set[A] は Map[A, Boolean] とほぼ同じとみなせる。すると集合の積(共通部分)の実装が論理積から導けるし、集合の和も論理和から導ける。さらに Map[A, Int] とすれば多重集合についても同様に導ける。

2017-10-01 16:41:00
e_do_kiriko @e_do_kiriko

そうなのよね。関係は合成のことを考えればA×Bの部分というよりもAからPow(B)と考えた方がいい。Powはモナドになるのでクライスリ圏が関係の圏と同じというのもあるので。

2017-10-01 17:04:00
e_do_kiriko @e_do_kiriko

かつ、Pow と 2^(_) が同型になることも面白くて、2からの類推でNatを考えれば、Nat^(_)はまさに多重度付きのことなのよね。というよりむしろ、Natの和を冪等により積み上がらないことで2になったとも言える。

2017-10-01 17:05:55
e_do_kiriko @e_do_kiriko

2^(_) は 集合、Nat^(_)は多重集合ということですね。

2017-10-01 17:06:59
e_do_kiriko @e_do_kiriko

A×Bの部分 あるいは A -> B -> 2 あるいは A -> Pow(B) は 2値の行列として表現できるので、、といろいろ考えると豊かな世界が待ってる。 twitter.com/e_do_kiriko/st…

2017-10-01 17:11:05
e_do_kiriko @e_do_kiriko

d.hatena.ne.jp/m-hiyama/20140… から関係の圏で対角と余対角から関係R,S : X -> Yの和R∨S : X -> Yを作る操作を行列で確かめてる. pic.twitter.com/L8BT2AYjik

2015-03-09 17:53:33
pokarim @pokarim

最近得られた知見としては、 reactive programming 的な方向を突き詰めていくとデータ構造が mutable か immutable かという違いは捨象されてしまう、というものがあります。

2017-10-02 17:15:58
pokarim @pokarim

データに対する不変条件やデータ間の関係性というものに着目して記述していくと、すべての瞬間において不変条件が満たされていればそれでよく、データの変更が破壊的かどうかは割とどうでもよいことになる。

2017-10-02 17:24:53
pokarim @pokarim

最終的にはデータが可変か永続的かというのは、パフォーマンス・チューニングの観点から決まる問題ということになる。アプリケーションの仕様というレイヤーから考えればこれはとても自然。

2017-10-02 17:27:12
pokarim @pokarim

長いことデータ構造が永続的でなければ話にならん、というような感覚でいたので、個人的にも目からウロコ的なところもある。

2017-10-02 17:30:17
pokarim @pokarim

あとは、プログラミングやDBの文脈では、あくまで代数的な構造が大事なのであって、集合や関係代数に限定して話を進める必要はないという認識にいったったのが最近の大きな変化です。

2017-10-02 17:33:28
pokarim @pokarim

多項関係なんて持ち出さなくても、より小さな部品たとえばハッシュマップに対して代数的な演算を定義することは出来るし、段階的に物理層や実行計画を抽象化していくということも可能だったということです。

2017-10-02 17:39:43
pokarim @pokarim

個人的には二項関係に着目してやってきましたが、データ構造のネストについて考えるうちに、単なる Map 的な構造に解体されてしまった感じです。

2017-10-02 17:43:11
pokarim @pokarim

別に Map を特別扱いするというわけでもありません。リストでも優先度付きキューでもなんでも必要に応じて使えばよい。それくらいでないと領域によっては使いづらい。

2017-10-02 17:45:06
pokarim @pokarim

React が解決したのって雑に言うと「ViewModel のスナップショットからDOMを生成するのは簡単でも、 ViewModel の状態の差分から DOM の差分を生成するのは難しい」という問題だと思ってる。

2017-10-02 22:17:38
pokarim @pokarim

ViewModel という言葉は雑に使いました。

2017-10-02 22:17:55
pokarim @pokarim

状態の差分というのは、状態の更新というのとほぼ同義です。

2017-10-02 22:18:36
pokarim @pokarim

そしてそこでは DOM が mutable だということが捨象されている。

2017-10-03 18:31:13
pokarim @pokarim

React が解決した問題と解決できてない問題があって、それは関数プログラミングでも関係データベースでも同じなんだけど、どうしても全面的な否定か肯定かに偏りがちであることだなあ。

2017-10-03 20:21:27
pokarim @pokarim

劇的な改善が行われると、最終的な解答が得られたように錯覚してしまいがちなのかもしれない。

2017-10-03 20:23:49
pokarim @pokarim

新しいものを導入する際にその良い面が強調されがちなのは受け手側も割り引くだろうから良いとして、ある程度普及した手法に対して利点欠点両面からの分析がいまいち見当たらなかったりするのはなぜなんだぜという気持ちです。

2017-10-03 20:34:02
pokarim @pokarim

そして新しい手法が導入される際に、旧来の手法が徹底的にこき下ろされたりしがちというのもある。何かと極端に振れやすい。

2017-10-03 20:37:23
pokarim @pokarim

文句言うなら自分で書けという気持ちになったのでこの話題は終了

2017-10-03 21:09:53
Yuta Okamoto @okapies

@pokarim すいません、面白かったので勝手ながらまとめを作らせて頂きました。問題がありましたらご指摘ください。 togetter.com/li/1157369

2017-10-03 23:20:08
pokarim @pokarim

@okapies 了解です。面白かったですか。面白さがうまく伝えられてるか、いまいち手応えがなくてよくわからなかったので、少しでも共有できたのなら嬉しいです。

2017-10-03 23:45:38
pokarim @pokarim

GraphQL みたいな方向に行くと、最終的にはバリデーション含めた各種制約条件を如何に宣言的に定義するかということが問題になるんじゃないかと思います。

2017-10-04 00:01:54