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;

再帰するたびに引数リスト P の末尾が削られて R にカリー化された関数の形で溜まっていく.

タプルの末尾以外で ... が使えるのも TypeScript 4.0 のVariadic Tuple Typesのおかげ.

extends { length: 1 } するという [T] の判別の仕方,個人的には斬新だと思っているがたぶん既出そう.

実装する方法が全くわからないので関数型プログラミングライブラリとして著名なRamda.jsのソースを読もうとする.ちなみにRamda.jsは使ったことがない.

import _curry1 from './internal/_curry1';

というコードがあって怖気づく.そんな大層な関数を作らなければならないなんてやばいね!とおもう.

lodashの代わりにjustを使う を思い出す.そういえば just とかいう関数群があったな…あれならもっとうまくやっているかもしれない.justって書いてあるし.

せっかくなので Deno を使おうと試みている.さらにせっかくなので VSCode Remote Container に突っ込もうと画策している.Yak shavingの王とは私のことだ.

JavaScript/TypeScript筋に比べてDocker力がぜんぜん無いので学ばなければならないとおもった.

ついでにLinuxの使い方も全然.

just-curryの実装を見て,Function.length というプロパティがあることを知った.たしかにJSが動的型付けとはいえ,関数が生成される時には仮引数の数は確定している (可変長引数は知らん).

というか可変長引数はargs的な感じで配列として1つにまとまるから普通に1個カウントな気がする.

just-curryの実装が生JSかつthisとargumentsが乱舞する感じでしかも再帰沼が深すぎてTSが死ぬ.

つかれたし遅いので寝る,明日やるかは知らない

ログインするとコメントできます