generated at
Lightweight Higher-kinded Polymorphism

高階型の無い型システムにおいて高階型をエンコードする方法。
defunctionalizationを応用して、HKTの高階型を関数、型適用を関数適用にそのまま当てはめる。

ocaml
(* 文献1より引用 *) (* 型適用を表す型 'f 'a === ('a, 'f) app *) type ('a, 'f) app (* * -> * を表す型用モジュール *) module type Newtype1 = sig type 'a s (* 元のOCaml世界の1引数型コンストラクタ 'a list, 'a option, etc. *) type t (* HKT世界の(高階)型 List.t : * -> * *) val inj: 'a s -> ('a, t) app val prj: ('a, t) app -> 'a s end (* HKT用ファンクタ *) module Newtype1(T: sig type 'a t end) : Newtype1 with type 'a s = 'a T.t module List = Newtype1(struct type 'a t = 'a list end)

fp-tsにおける高階型
fp-tsでは HKT というinterfaceが用意されている。作者が Option を題材に使い方を説明している。

TS的にはかなりいい線行ってると思うがそこそこつらい、早く、早くfirst-class modulesを…

参考文献
1: Yallop, Jeremy, and Leo White. "Lightweight higher-kinded polymorphism." International Symposium on Functional and Logic Programming. Springer, Cham, 2014.