4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

fp-ts 関数を繋げる

Last updated at Posted at 2020-07-14

fp-tsでは pipe という関数で関数を繋げていきます。Haskellの do やScalaの for に相当するものですが、
表現力はなかり見劣りします。

Monadクラスを使用した場合の関数の2形態

Monadクラスの例としてOptionを用いていますが、ReaderでもTaskEitherでも共通の話題です。

Monadクラスで関数を扱っていると、以下のような関数の形態に出くわします。形態ごとに関数の繋げ方が違ってきます。

liftされた関数

liftされた関数はちゃんとした関数なので他の関数と合成が可能。

(ma: Option<A>) => Option<B> // liftされた関数

閉じ込められた関数

Monadクラスのインスタンスの中に関数が閉じ込められているので、これ自体は関数ではない。なので、他の関数との合成はできないし、そのままでは呼び出せない。その代わり閉じ込められた関数を呼び出す仕組みが用意されている。

Option<(a: A) => B> // 閉じ込められた関数

関数を繋げる: liftされた関数用

以下の方法で関数をliftします。共通で代表的なものは以下の2つです。他にも亜種、各Monadクラス特有のliftについて色々あります。

map

(a: A) = >Bという関数を(ma: Option<A>) => Option<B>に変換する。

map: <A, B>(f: (a: A) => B) => (ma: Option<A>) => Option<B>

chain

(a: A) => Option<B>という型の関数を(ma: Option<A>) => Option<B>に変換する。

chain: <A, B>(f: (a: A) => Option<B>) => (ma: Option<A>) => Option<B>

関数を繋げる: 閉じ込められた関数用

ap

ap を使うことで閉じ込められた関数 <B>(mab: Option<(a: A) => B>)
引数 <A>(ma: Option<A>) で呼び出すことができます。これにも色々亜種、各Monadクラス特有のものがあります。

ap: <A>(ma: Option<A>) => <B>(mab: Option<(a: A) => B>) => Option<B>) => Option<B>
4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?