型システムのしくみ

TSとJS初心者すぎて
import { parseArith } from "npm:tiny-ts-parser";
console.log(parseArith("if 1 then 2 else 3"));
をまっさらなディレクトリで ➜ deno run -A test.ts
しようとしたらnode_modules/
がないと動かなくて詰まった

2章の演習問題からしてよくありそうな考えを正してくれてよいな..

仮引数と実引数の呼びわけにそんな文化があるとはしらなんだ

スコープ、ではなく 見えてはいけない文脈 と表現しているの優しいな

3章はこんな感じだね
console.log(typecheck(parseBasic("((x: boolean) => x)(x)"), {}));

4章も構造が違うとどういうデメリットがあるかしっかりわかってすごい。先頭と外を分けるって考え方、なんでもいい感じになりガチだなぁ

5章の演習問題を書いてあるとおり読み飛ばす

型推論とかいう複雑な連立方程式
6章の再帰関数の実装も「これって実際の〇〇ではどうなっているんだ」という疑問の答えがすぐ書いてあってよい

6章、研究で読んだ簡単な関数型言語の考え方と似ているな。これもlet式とletrec式で分けて実装されていた。

6章
funcもrestのtypecheckを実行しないといけないのか。そもそも文と呼ばれがちな変数参照や逐次実行、関数名を含めた関数宣言はrestの型検査を始めないといけないのか

6章
不動点コンビネータとかYコンビネーターとかZコンビネーターとか研究でもやったけど結局よくわからんかったな

演習問題のためにexamples動かしたいなら以下のコマンドが楽
cd book
deno install
deno run -A --config deno.jsonc examples/recfunc.ts
deno.jsoncのimportの設定ってディレクトリずれると使えないのか...? よくわからない

7章、部分型という名前の説明神だ。確かに型というのは指定するほど集合が少なくなるな

7章の7.10のコードの説明ちがわない?gはboolを返しそうだけど。

7章
AがBの部分型として、
- 関数の値の型は部分型の定義と同じで素直(Aを返す関数の型は、Bを返している関数の型の部分型)
- 関数の引数の型は、逆でBを取る引数の型はAを取る引数型の部分型
- 関数の引数の型は、関数の内部でAしかもっていない要素を参照される可能性がある
- つまり、A引数にB引数を渡してはいけない。B引数にA引数を渡すのはOK
う〜ん言語化が難しいということはあんま理解していないかも

μ(ミュー)も再帰の文脈であったなぁ。それ自身を環境に追加するという意味なのかもしれん

再帰型の実装、複雑すぎるな...

ダウンキャストのコラム、部分型という単語への理解が重要だな

fにxを適用じゃなくて、xにfを適用なんだ。
確かに関数型言語だと x |> f とか書くな。計算の流れでいうとまず具体的な型があって、次に関数の返す型になるからかな

引数として「型抽象された型を持つ関数」を取る関数に、「具体的な方を持つ関数」を渡してはいけないって話、
Aを引数にとる関数には、Aの部分型を渡しても良い とは逆だな