Imaginantia

思ったことを書きます

Entries from 2017-01-01 to 1 year

文法という大問題

www.egison.org やりたいことは非常に正しい。が、その実現方法はきっと最高のものではない。 この言語は未来永劫使われるためのものではないことを本人たちもわかっているとおもうのだけど。 結局すべての問題の根底にあるのは文法なのである。 記述力を補…

条件分岐と関数合成 / 例

条件分岐と関数合成 - Imaginantia f = do b ← do a = g() if a.valid then B(a, true) else do a = h() B(a, false) return C(b) 近いが遠ざかった・・・ これは結局無名関数の即時実行ができるみたいな気持ち C f(){ B b = [(g,true), (h,false)].firstJus…

perspective / paradigm-shift

スタックに決まったデータを積むには時間がかかるが、スタックポインタをデータの先頭に持っていけば一瞬である

fast-returnの違和感

条件に応じて消えていく感じ、手続き型でありながら関数型に近い 歪みつつ混ざり合っている感じ これも正しい文法を与えることができそう

条件分岐と関数合成

次のプログラムを考える。 C f(){ A a = g(); bool flag = true; if(!a.valid){ a = h(); flag = false; } B b(a, flag); return C(b); } 結構ありうるシチュエーションだとおもう。 このプログラムの中で、 flag は本質的ではない。というのは b の構築自体…

情報という概念

情報理論などにおける「具体的な情報」ももちろん大事なのだけど、「抽象的な情報」も大事だとおもうわけで。でもそんな理論みたいなのは聞いたことがあまりない。 離散フーリエ変換は情報を失わないとか ポインタにするとデータの大きさ情報が失われるとか …

具体的すぎてわかりにくい

例えば2次元図形で。 左上 右下 で定義される矩形がある。 これを左上 右下 にするような平行移動と拡大縮小のパラメータを計算したいとする。 前提から の4つのパラメータを計算すればいいことはすぐわかる。 でもそれを具体的に計算するには方程式を解くし…

実行順でしかプログラムを読めない人たち

今までの手続き型言語に慣れた人たちが関数型とかに行くとプログラムがわからないのはきっとそういうことなのだとおもう。 きっとその人達は「実際にやる内容」とか、特に「時間」を気持ちの前提に置いている。そしてそれは関数型やストリーム処理などとは相…

連結と単連結

HoTTの話。 や はもちろん連結。 は連結ではない (2点集合)。 は単連結で、 は単連結でない。 ごちゃごちゃしてるけど次元で整理すると単純。 は-連結で-連結でない は-連結で-連結でない は-連結で-連結でない

モノイド的構造

Monoid Ordering (文字列順序) () (自明) Any (or) All (and) Semigroupの一点モノイド化 (e*s = s = s*e) Last (Maybe a) First (Maybe a) Product Sum Endo Max (Ord, Bounded) Min (Ord, Bounded) Semigroup Void NonEmpty Last (a) First (a) Max (Ord) …

Yoneda / co-Yoneda

Data.Functor.Yoneda Data.Functor.Contravariant.Coyoneda Yoneda lemma : ∀ b. (a → b) → f b ≅ f a (f : Functor) co-Yoneda lemma : ∃ b. (a → b, f b) ≅ f a (f : Contravariant) 左から右に (a → b) として id を取れる。a = b より f b = f a が返る…

TensorとHom

adjunctionの話じゃなくて。 を整理したかった。 Hom に成るベクトル空間。 双対ベクトル空間 に成るベクトル空間。 でもある。 に対して、 である。 元の空間の基底をとすると、対応する双対ベクトル空間の基底として を取れる。(ここで はベクトル の 成分…

クロージャの実装

const f = _=>{ let a = 0; return _=>a++; }; const b = f(); const c = f(); b(); c(); b と c は異なる a を参照する。これらは実装的に「_=>a++;」と「a を持っている環境」から成っている。はず。あとprototype。 で、これをコンパイル言語で「挙動を再…

分離と統合

概念は、分離するべきなのか統合するべきなのか。多分正解はない。 ただ「関数」は様々な概念を包括しすぎではないだろうか。「全てが関数」というのは聞こえはいいが、考えてみればこれはその操作に本来備わっていたはずの直感を捨てていることに他ならない…

アクセスの概念

「データ構造の一部を操作する」という意味でのアクセスを面白い形で抽象化するのがlensである。 このライブラリは以下の種類のアクセスを扱えるようになっている。 相互変換 (Iso) 片側変換 (もう片方は常に可能) (Prism) 読み出し・書き込み (Lens) 複数の…

hashとunion

hash :: (Hashable a) => a -> Hash 「hashが衝突しない」という仮定の下では、この関数の存在は「Hashは全てのHashableな型たちから成るDisjoint Unionを部分に含む」という意味になるのではないだろうか?そうすると色々と面白いことが考えられる。 実質的…

遅延評価のあるべき姿

遅延評価は非常に興味深いシステムではある。普段通り書いた手続き型のプログラムにおける無駄をシステマチックに省くことができる。 が、本当にそんなにも無駄なコードを書くだろうか? いろんなデータを計算する関数の戻り値の一部しか使わないとして、そ…

structとlinear type

ある大きなデータ構造 T を考える。T のメンバとなっている変数 a の値についての操作を考えたい。 「a を書き換える」ということをしたい場合、純粋世界では必ず構造 T を再構築せざるを得ない。 これでは明らかに負荷が入るため、そこで「他で使われていな…

解説

今までサークル内wikiの/user/phi16/memo/nazoという残念な項目に小さく書きつらねていたような事柄を、blogで書くようにしようと思います 既にあるものは気が向いたら移します