Open20

型システムのしくみ

クワイング/QWYNGクワイング/QWYNG

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/がないと動かなくて詰まった

クワイング/QWYNGクワイング/QWYNG

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

クワイング/QWYNGクワイング/QWYNG

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

クワイング/QWYNGクワイング/QWYNG

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

クワイング/QWYNGクワイング/QWYNG

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

クワイング/QWYNGクワイング/QWYNG

演習問題のためにexamples動かしたいなら以下のコマンドが楽

cd book
deno install
deno run -A --config deno.jsonc examples/recfunc.ts

deno.jsoncのimportの設定ってディレクトリずれると使えないのか...? よくわからない

クワイング/QWYNGクワイング/QWYNG

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

クワイング/QWYNGクワイング/QWYNG

7章
AがBの部分型として、

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

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

クワイング/QWYNGクワイング/QWYNG

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