Row polymorphism
OCamlにもあるらしい
{ a :: A | r }
と書けば、
{ a :: A}
は許容する
{ a :: A, b :: B }
も許容する
{ b :: B, c :: C}
は許容しない
擬似コードを

に書かせて理解しようと思ったけど、これ疑似TypeScriptじゃだめだな

実行時に型情報を見て挙動が変わるようなものを想定しないと理解がおかしくなる
参考
forall r. { foo :: Int, bar :: Int | r } -> Int
の r
がRow型
hsに入れるproposal