Open19
【TypeScript】カリー化関数を書きたくなった
唐突に関数をカリー化したくなってきた。まず型を書く。
実際の型がこちら。TypeScript 4.1 で Conditional Types での再帰の制限が緩和されたおかげで素直に再帰しても怒られが発生しない。
type Curry <P extends unknown[], R> = P extends { length: 1 } ? (p: P[0]) => R : P extends [...infer B, infer T] ? Curry<B, (t: T) => R> : never;
実装する方法が全くわからないので関数型プログラミングライブラリとして著名なRamda.jsのソースを読もうとする.ちなみにRamda.jsは使ったことがない.
lodashの代わりにjustを使う を思い出す.そういえば just とかいう関数群があったな…あれならもっとうまくやっているかもしれない.justって書いてあるし.
わりと簡単そう.
せっかくなので Deno を使おうと試みている.さらにせっかくなので VSCode Remote Container に突っ込もうと画策している.Yak shavingの王とは私のことだ.
just-curryの実装を見て,Function.length
というプロパティがあることを知った.たしかにJSが動的型付けとはいえ,関数が生成される時には仮引数の数は確定している (可変長引数は知らん).
というか可変長引数はargs的な感じで配列として1つにまとまるから普通に1個カウントな気がする.
just-curryの実装が生JSかつthisとargumentsが乱舞する感じでしかも再帰沼が深すぎてTSが死ぬ.
つかれたし遅いので寝る,明日やるかは知らない