TL;DR

引数をまとめて渡す書き方と、部分適用(カリー化)する書き方の両方に対応した API。Effect の多くの API がこの形になっている。

なぜ必要か

pipe の中で使うとき、部分適用の形で書けるとコードが短くなる。たとえば次のコードは、

fetchRequest.pipe((fetchRequestEffect) => Effect.flatMap(fetchRequestEffect, jsonResponse))

次のように書き換えられる。

const main = fetchRequest.pipe(Effect.flatMap(jsonResponse))

仕組み

Effect.flatMap の定義を簡略化すると、2 つのシグネチャを持つ。

export declare const flatMap: {
  <A, B>(f: (a: A) => Effect<B>): (self: Effect<A>) => Effect<B>
  <A, B>(self: Effect<A>, f: (a: A) => Effect<B>): Effect<B>
}

1 つ目は関数だけを受け取り、Effect を待つ関数を返す。2 つ目は Effect と関数をまとめて受け取る。

例

引数をまとめて渡す場合。

const main = pipe(fetchRequest, (fetchRequestEffect) =>
  Effect.flatMap(fetchRequestEffect, jsonResponse),
)

部分適用する場合。

const main = pipe(fetchRequest, (fetchRequestEffect) =>
  Effect.flatMap(jsonResponse)(fetchRequestEffect),
)

関連

出典