このページの内容

Awesome FP JS

FP JSを扱う資料や関連プロジェクトをまとめたAwesomeリストです。

目次

タグ

各項目には次のタグが付く場合があります。タグの意味を満たすかどうかを示すため、先頭に「+」または「-」を付けます。「-」タグは、用途に合うライブラリを絞り込む助けになる場合にだけ記載します。たとえば、型を確認したいTypeScriptユーザーには-TSが役立ちますが、-CTは多くの場合あまり役立ちません。

  • CT. 圏論。Haskell、Scalaなど、圏論を基礎とする関数型言語のライブラリから着想を得ているように見えるライブラリです。
  • TS. TypeScript。TypeScriptの型定義を備えたライブラリです。

ライブラリ

  • Ramda – JavaScript向けの実用的な関数型ライブラリ。関数型プログラミングに特化し、関数パイプラインを構築しやすく、ユーザーのデータを変更しないよう設計されています。+TS
  • Ramda Adjunct ラムダのコミュニティが維持する拡張ライブラリ。
  • Ramda-extension - Ramda関数だけで構成された、ポイントフリースタイルのユーティリティ関数集。
  • Rambda - ラムダより10kB未満で高速な代替ライブラリ。
  • Rambdax - ラムダの拡張バージョン
  • Folktale – JavaScript向け関数型プログラミングの標準ライブラリ。2020年中にはTypeScript対応が予定されています。-TS
  • lodash/fpLodashのインスタンスをラップし、不変、自動カリー化、イテレーターファースト、データラストのメソッドを生成します。+TS
  • iterflow - TypeScript向けの強力なイテレータユーティリティ。統計演算、ウィンドウ処理、遅延評価をサポート。+TS
  • functional.js – 軽量なJavaScript関数型プログラミングライブラリ。カリー化やポイントフリー/tacitプログラミングを支援します。
  • 101 – シンプルでモジュール化された現代的なJavaScriptユーティリティライブラリ。vanilla JavaScriptメソッドとの良好な互換性を確保。-TS
  • fnuc – CoffeeScript(およびJavaScript)向けの関数型プログラミングライブラリ。関数合成や高階関数を支援します。
  • barely-functional – 非常に小さい(2.7kb)関数型プログラミングライブラリ。ネイティブのES5/6操作を使用します。-TS
  • bluebird-promisell - Promise向けの実用的な関数型プログラミングライブラリ。
  • prelude.ls – ハスケルのPreludeモジュールに若干基づいた、機能指向のユーティリティライブラリ。-TS
  • preludejs - JavaScript向けの本格的な関数型プログラミングライブラリ。-TS
  • 1-liners – 機能が極めてシンプルなツール。愛と注意を込めて手作りされた、シンプルな機能ユーティリティセット。-TS
  • fn-curry – 関数をカーリングするためのシンプルな関数。
  • curry – function bind構文を使って関数をカーリングする。
  • compose-function – 小さな関数から新しい関数を構成する。
  • functionize – 非関数型ライブラリを関数型ライブラリへ変換するための関数集。
  • lambdajs – 関数型スタイルで実装された完全なECMAScript API。
  • fp-dom – DOMを関数型スタイルで扱います。
  • react-on-lambda - ReactにおけるJSXを関数(カーリング、合成など)で置き換える
  • trifl – 単方向データフローと仮想DOMを備えた関数型ユーザーインターフェースライブラリ。
  • funcy – JavaScriptへ関数型パターンマッチングを追加する実験。Experimental :triangular_flag_on_post:
  • date-fp – JavaScriptの日付操作用の関数型ユーティリティライブラリ。すべての関数は純粋かつ自動カリー化され、対象の日付オブジェクトを変更しません。
  • js-joda – ISO 8601カレンダーに基づく、シンプルでドメイン指向のクリーンなAPIを提供する不変の日時ライブラリ。
  • _part_ – ネイティブメソッドを部分適用関数として提供することで、関数型プログラミングを促進するマイクロライブラリ
  • claire – プロパティベースのテストライブラリでコードの不変性と振る舞いを明確に指定できる
  • FPO.js – Kyle Simpson(getify)によるJavaScript向けの関数型ライブラリ。名前付き引数スタイルのメソッドをサポート。
  • Javascript Parser Combinator – HaskellのParsecをインスピレーションとして作られたJavaScriptパーサーコンビネータ
  • fun-task – JavaScriptで非同期コードを管理するための抽象。タスクはプロミスに似ているが、タスクは計算を表すことができる一方、プロミスは計算の結果を表すだけである。Flow型定義を同梱。
  • most – 超高速なリアクティブプログラミング。値とイベントのストリーム上で非同期操作を構成する際に、副作用や可変共有状態に伴う多くの危険を回避できます。
  • zen-signals – ☯ 最もシンプルなシグナルライブラリ
  • funfix – FunfixはJavaScript、TypeScriptおよびFlowでの関数型プログラミングに用いる型クラスとデータ型のライブラリ。+CT, +TS.
  • pico-lambda - 配列や文字列などを関数型スタイルで扱う、ネイティブメソッドベースの640バイトのライブラリ。-TS.
  • pareto-js - JavaScript向けの非常に小さく、直感的で高速な関数型ユーティリティライブラリ。-TS.
  • fpEs - 基本的な関数型プログラミングとパターンマッチング/サムタイプとMonadIO/RxおよびOptionalのシンプルな使用を提供する小さなライブラリ。-TS.
  • Creed – 高度な機能を備えた、洗練された非同期処理:コルーチン、プロミス、ES2015のイテレーター、fantasy-land。-TS.
  • TGrid - グリッドコンピューティングフレームワーク、TSTLのネットワークおよびスレッド拡張。RFC(リモート関数呼び出し)をサポート。+TS.
  • Ferrum – イテレータライブラリで、オブジェクトをイテレート可能なものとしてサポートし、遅延評価とpipe()を実装。JavaScriptにRustのTraits/HaskellのType Classesを実現。-TS.
  • fp-ts - TypeScriptにおけるタイプ付き関数プログラミング。+CT, +TS.
  • iter-tools - 同期および非同期のイテレート処理に用いる豊かなツールセット。+TS.
  • remeda Ramdaに近い関数ライブラリだが、TypeScriptで記述されているため、型の扱いがより優れている。+TS.
  • futil-js - lodash/fpのようなライブラリの一部として考えられる関数ユーティリティのコレクションだが、何らかの理由で含まれていない。
  • rubico - 🏞 非同期関数構文[a]
  • rocket-pipes - ポワーピプ、PromiseおよびMaybeやEitherといった人気FPライブラリから導入されたADTを連鎖的に処理。+TS
  • omg-curry - 包括的なカーリングライブラリ。演算子カーリング、関数カーリング、デカーリング、無限カーリングを含む。
  • lfi - 遅延評価と並列処理をサポートする、同期、非同期、並列イテレーションを可能にするイテレータライブラリ。
  • ts-multimethod - ClojureのマルチメソッドにインスパイアされたTypeScriptのマルチメソッド。+TS
  • ts-fp-di - Node.jsのAsyncLocalStorageに基づく、Tiny TypeScriptの関数型DI。+TS
  • effect-ts – TypeScriptにおける完全な関数効果システムと豊かな標準ライブラリ。+TS
  • qio – 型安全かつ関数型、パフォーマンスに優れ、法則的に設計されたデータ構造。Nodeおよびブラウザにおける効果を含むコードの実用的な問題を解決。+TS
  • Ditox.js - モジュラーなアプリケーションの構築に用いる強力な依存関係注入コンテナ。+TS
  • RxEffects - RxJSを用いたリアクティブな状態・エフェクト管理。+TS
  • fxts - 遅延評価と並列処理。+TS
  • ts-belt - TypeScriptにおける関数プログラミングに最適化された高速で現代的かつ実用的なユーティリティライブラリ。(remedaのようなデータ中心アプローチを採用しているが、remeda、ramda、rambda、lodash/fpよりも。) faster
  • fp-multik - JS/TSの軽量値マルチメソッドユーティリティ
  • true-myth TypeScriptにおける安全かつ自然なnullおよびエラー処理のためのライブラリ。MaybeおよびResult型をサポートし、関数スタイルおよび伝統的なメソッド呼び出しスタイルの両方をサポート。
  • ts-pattern - TypeScriptにおける包括的なパターンマッチングライブラリ。スマートな型推論を備えている。パターンマッチングはFP言語から導入されたコード分岐技術である。
  • hyogwa - 自然な 🌿 フォームがTypeScriptに適合する;シンプルなTypeScriptコードをそのまま書くだけでOKです。
  • Verticalize - パイプ演算子に見える、非常に軽量な関数。
  • PureEval - 強力なJavaScriptの関数型プログラミングツールセット、ユーティリティ関数と抽象データ構造を含む。
  • context-fp - 極小の関数型プログラミングコンテキスト、すなわち依存性注入。+TS
  • klubok - テストが大量に必要になる場合に用意された、簡単にモックできるパイプ。+TS
  • fp-filters - 130以上にわたるよく使われるフィルタ関数のコレクション。関数型プログラミングスタイルで書かれており、軽量な直接インポートが可能。ESモジュールおよびCommonJSをサポート。100%ユニットテスト済み。+TS
  • tinyeffect - 代数的効果を用いて、一貫した方法で副作用を処理するための、非常に小さなTypeScriptライブラリ。+TS

データ構造

用途に合ったデータ構造を使い、高性能な関数型コードを書きましょう。

  • Icepick 凍結されたJavaScriptオブジェクトを永続的な不変コレクションとして扱うためのユーティリティ。
  • Immutable.js – 不変な永続データコレクション。
  • Immer – Immerは、コピーオンウイトメカニズムに基づく不変状態を提供する、非常に小さなパッケージ。+TS
  • Mori – ClojureScriptの永続データ構造とサポートAPIを、シンプルなJavaScriptで使いやすいように提供。
  • Baobab – カーソルを用いた、永続的かつオプションで不変なデータツリー。
  • immutable-sequence.js – JavaScriptにおける不変シーケンスの高性能実装、に基づく。 Finger Trees
  • Timm – 読み込みが速く、書き込みも許容される不変性のヘルパー。
  • Lazy.js – 遅延評価エンジンを内蔵したユーティリティライブラリ。柔軟性を保ちながら、必要最小限の処理だけを行うことを目指す。
  • DerivableJS – JavaScriptおよびTypeScript向けの関数型反応状態。DerivableJSは、あなたの状態の各部分の関係性について、洗練された宣言的表現を可能にします。+TS
  • imlazy – ES2015のイテレーションプロトコルを用いて、遅延イテラブルを作成・操作するためのライブラリ。
  • collectable – 現代のJavaScriptおよびTypeScriptアプリケーション向けの、非常に高速な不変データ構造。+TS
  • List - 非常に高速な不変リストで、包括的な関数APIを提供。設計はseamlessly integrate with Ramdaに基づく。
  • prelude.ts - 不変な永続コレクション、OptionやEitherといった関数型構造、およびコンビネータ。TypeScriptで実装されているが、JavaScriptにも対応。+CT, +TS.
  • TSTL - C++ STL (Standard Template Library) は TypeScript で実装されている。関数型プログラミングのルールに従った STL コンテナ、イテレータ、アルゴリズム、ファンクタが提供されている。+TS.

代数的データ型

独自の仕組みを毎回作り直す代わりに、数学の法則を活用しましょう。代数的に!

  • Fantasy Land – ライブラリではなく、ライブラリが遵守すべきモナドの法則を定義した仕様。
  • Static Land – Fantasy Land に類似した仕様だが、インスタンスメソッドではなく静的メソッドに基づいている。
  • immutable-extImmutable.js 用の FantasyLand の拡張。
  • daggy – タグ付きコンストラクタを作成するためのライブラリ。
  • Sanctuary – Sanctuary により、nullチェックをせずに安全なコードを書くことが可能になる。+CT, +TS.
  • monet.js – モナドやその他の便利な関数を豊富に提供することで、関数型プログラミングを支援するライブラリ。+CT, +TS.
  • union-type – JavaScript で連合型(union types)を定義および使用するための小さなライブラリ。
  • freeky – Free monads のコレクション。
  • Fluture – Future ライブラリで、制御ユーティリティが含まれており、高性能かつエラーメッセージが優れている。
  • fantasy-combinators – 共通のコンビネータのコレクション。
  • fantasy-birds – Haskell パッケージ Data.Aviary.Birds のポート。すべてのコンビネータニーズに応えるためのもの。
  • crocks – 人気のある代数データ型のコレクション。主な目的は、各型間の共通インターフェースを整備し、実行開始に必要なすべてのヘルパー関数を提供すること。-TS.
  • kudo-js - JavaScript で関数型プログラミングスタイルのコードを書くために、代数データ型とヘルパー関数を提供する小さなユーティリティライブラリ。
  • purify - TypeScript 用の関数型プログラミングライブラリで、ADT(代数データ型)に焦点を当てている。+CT, +TS.
  • MojiScript- JavaScript エンジンとの100%互換性を保つように設計された、非同期を第一に考え、意見をもつ関数型言語。
  • Pratica - 実用的で生産性の高い開発者向けに、信頼性の高いコードを迅速に配布するために必要な、シンプルで小さなFPデータ型。+CT, +TS.
  • Tifi - Tifi は TypeScript での関数型プログラミング用のライブラリ。undefinednull の共存問題を解決する。OCaml/Reason のオプションデータ型用のユーティリティにインスピレーションを得ている。+CT, +TS.
  • sweet-monads - 人気のあるモナド(例:Either および Maybe)と、遅延イテレータのコレクション。
  • NeverThrow - このパッケージは、成功()または失敗()を表す 型を含んでいる。 Result Ok Err

レンズ

  • lenses – 合成可能な kmett スタイルのレンズ
  • optics – プロファンクター光学(レンズ、プライズム、iso)
  • ramda-lens – :ram: :mag_right: レンズライブラリ(ラムダベース)
  • fantasy-lenses – 合成可能で不変なゲッターとセッター。(プロファンクターレント WIP)
  • nanoscope – ドットサポート付きのレンズ
  • partial.lenses – パーシャルレントはJavaScript用の包括的かつ高性能な光学ライブラリ
  • shades – リズドのインスピレーションを受けたJavaScript向けレント風ライブラリ

JavaScriptへコンパイルされる関数型言語

  • ClojureScriptClojure、不変な持続データ構造を持つホストLispをJavaScriptにコンパイル
  • Elm – 宣言的にウェブブラウザベースのグラフィカルユーザーインターフェースを作成するための型安全な関数型プログラミング言語。ハスケルで実装。
  • Fable - F#を読みやすいJavaScriptにコンパイル
  • PureScript – JavaScriptにコンパイルされる小さな強型プログラミング言語
  • Idris – 一般目的の純関数プログラミング言語(依存型を備える)
  • GHCJSHaskellをJavaScriptにコンパイルするコンパイラ(GHCベース)
  • ElixirScriptElixirの一部をJavaScriptにコンパイル。拡張性と保守性を重視した動的関数型言語を構築するための言語。
  • Js_of_ocamlOCamlのバイナリコードをJavaScriptにコンパイルし、ブラウザ上でOCamlプログラムを実行可能にする
  • Reason – ReasonはOCaml、ML言語の高度な表現力を持つ方言であり、型推論と静的型チェックを備えた新しいインターフェース
  • ReScript – (以前は Bucklescript と呼ばれていた)ReScriptは、最高品質のシンプルで読みやすく、パフォーマンスの高いJavaScriptコードにコンパイルされる型安全な言語
  • Scala.jsScalaをJavaScriptにコンパイル
  • LiveScript – LiveScriptはJavaScriptに直接マッピングしており、繰り返しのボイラープレートを避けた表現的なコードを書ける
  • Quack - PHPおよびJSをターゲットとする多パラダイムプログラミング言語(段階的およびダック型)
  • ion - バズなしJS
  • RamdaScript - ラムダJS上で意見をもつJavaScriptにコンパイルされるLisp
  • RacketScript – ラケットスクリプトはJavaScriptとラケットのエコシステムを活かし、それらの間の相互運用性をシンプルでスムーズなものにすることを目指しています
  • Koka – Kokaは、JavaScriptのような構文を用いて純粋な値と副作用をもつ計算を分離する関数指向プログラミング言語です
  • TypeScript - TypeScriptはJavaScriptの型付きスーパーセットであり、純粋なJavaScriptにコンパイルされます
  • Gleam - Gleamは、ErlangおよびJavaScriptにコンパイルされる、型付き関数型言語です

プログラミングツール

  • eslint-plugin-fp - 関数型プログラミング向けのESLintルール
  • 4.5 – 関数型アサーションライブラリ。JavaScriptにおいて関数スタイルのAPIや実践を好む場合、このライブラリはラグレとモノイド的な関数型アサーションでその課題を解決することを目指しています
  • hm-def – JavaScriptにおける実行時型チェックをHindley-Milnerのシグネチャで実現
  • ftor - パラメトリック多相と行多相、暗黙のランク2型、Scottエンコーディングによる代数的データ型をサポートする、拡張可能な実行時型チェック兼関数型デバッグツール

資料

書籍

  • Professor Frisby’s Mostly Adequate Guide to Functional Programming – これは、世界で最も人気のある関数型プログラミング言語であるJavaScriptを用いて、関数型パラダイムの一般について書かれた書籍です。現実世界の例を通じて直感を構築する実用的な導入書であり、強くおすすめされます。 Brian Lonsdorf (2016)
  • Functional-Light JavaScript – この書籍は、JavaScriptに適用可能な関数型プログラミング(FP)の基本原則を探索します。しかし、この書籍が他のものと異なるのは、すべての重い用語を避けながらこれらの原則にアプローチしている点です。
  • JavaScript Allongé, 「Six」版。関数についての説明はできるだけ少なく、しかしそれほど少なくない。そして、強力な組み合わせ子とデコレーターへと進んでいきます。基礎となる書籍。 Reginald Braithwaite (2016)
  • Functional Programming in JavaScript JavaScript開発者に、拡張性、モジュラリティ、再利用性、テスト性、パフォーマンスを向上させる関数型技術を教えます。具体的な例と専門用語を避けた説明を通じて、関数型プログラミングを現実の開発タスクに適用する方法を学びます。Luis Atencio (2016)
  • Eloquent JavaScript. JavaScriptを用いた現代的なプログラミング導入書。Marijn Haverbeke (2014)
  • Functional JavaScript JavaScriptの関数型プログラミングサポートを用いて、コードが美しく、安全で、理解しやすくテストしやすいように教えます。 Michael Fogus (2013)
  • Grokking Simplicity 関数型プログラミングを第一原理から教えます。すべてのコード例にJavaScriptを使用し、現実世界のシナリオを用います。 Eric Normand (2019)
  • scriptum - シンプルな関数型プログラミングライブラリと、その基盤にあるオンラインコース

記事

  • FP Concepts in JavaScript – JavaScriptにおける関数型プログラミング概念の導入。Ramdaを用いて、合成、ポイントフリースタイル、ファンクターといった概念を、最もシンプルな例を通じて教えます
  • Functional programming with JavaScript – JavaScriptにおける関数型プログラミングの別の導入書。特に、関数の適用による計算、無状態、副作用の回避という3つのテーマに焦点を当てています。
  • A gentle introduction to functional JavaScript – JavaScriptにおける関数型プログラミングを4回にわたって解説するシリーズで、関数型プログラミングがどれほど話題になっているかを理解できるようにします.
  • Functors from first principle - explained with JS - JavaScriptを用いてファンクター(functor)の概念を説明します.
  • Why Curry Helps – カーリング(currying)を使って再利用可能で宣言的なコードを書く方法についての短い概説.
  • Favoring Curry - Ramdaを用いたカーリングの実用的な応用について紹介します.
  • Functional Mumbo Jumbo – ADTs – 代数的データ型(Algebraic Data Types)について、初心者向けに解説します.
  • JavaScript and Type Thinking – JavaScriptのコードを論理的に考えるための「型の思考(type thinking)」について学びます。代数的データ型は、プログラムのエンティティを論理的に考えるための概念的基盤として紹介されます.
  • Lazy, composable, and modular JavaScript – ES6の4つの新機能——イテラブル、ジェネレーター、アロー関数、for-of——を、高階関数、関数合成、遅延評価と組み合わせ、よりクリーンでモジュール性の高いJavaScriptコードを書きます.
  • Why Ramda – 関数型プログラミングに慣れていない人にとっては、Ramdaはまったく役に立たないように見えますが、実際には、純関数型プログラミング言語で当たり前になっているコーディングスタイルを提供しており、関数の合成によって複雑な論理を簡単に構築できるようになります.
  • Monads in JavaScript – JavaScriptにおけるモナド(Monad)設計パターンについての紹介です.
  • A Monad in Practicality: First-Class Failures – JavaScriptにおける特定のモナド構造の実用的な応用例を紹介します:シンプルな失敗ケースを Maybe モナドで処理し、より複雑なシナリオを Either モナドまたは Validation アプリケイティブファンクターでモデル化します.
  • Functional programming – Gleb BahmutovによるJavaScriptにおける関数型プログラミングのさまざまな側面に関する多くの記事.
  • Functional Programming Jargon – 関数型プログラミング世界の専門用語をJavaScriptで解説します.
  • Data Structures in JavaScript – JavaScriptでさまざまなデータ構造を再実装するブログ記事シリーズで、その利点と欠点をよりよく理解できます.
  • So You Want to be a Functional Programmer - JavaScriptとElmにおける関数型プログラミングの簡単でわかりやすい紹介、例を含む.
  • Functional Programming for JavaScript People - Chet Corcosによる関数型プログラミングパターンの完全な紹介で、多くのJavaScriptの例を提供します.
  • Introduction to Immutable.js and Functional Programming Concepts - Facebookの人気ライブラリImmutable.jsにおける関数型データ構造とその用途についての概説です.
  • Master the JavaScript Interview: What is Functional Programming? - @ericelliottによる関数型の原則と用語の簡単な紹介です.
  • Composing Software - @ericelliottによるJavaScript ES6+からゼロから学ぶ関数型プログラミングおよび合成ソフトウェア技術に関する記事シリーズです.
  • Anonymous Recursion in JavaScript - JavaScriptにおける匿名再帰を実装するための短くわかりやすい記事です.
  • Functional Composition in Javascript – JavaScriptにおける関数の合成方法についての段階的な説明です。
  • Functional Programming Principles in Javascript - 純粋関数、不変性、第一級オブジェクト、高階関数といった関数型プログラミングの概念を学ぶための実践的なコード例
  • Basic Monads in Javascript - JavaScriptにおけるMaybeとEitherの2つの簡単なモナドについての紹介
  • F# for JavaScript Devs - F#とJavaScriptの類似点を紹介
  • A practical guide to writing more functional Javascript - 命令型JavaScriptをより宣言型かつ関数型のJavaScriptに変換するためのステップバイステップガイド
  • You don’t (may not) need loops ➿ - ループは初心者プログラマが最初に学ぶ構文の一つだが、ソフトウェア開発プロセスにおいて多くの問題を引き起こす可能性があり、多くのケースでは回避できる

動画

サンプルと演習

  • FPJS-Class – JavaScriptを介して関数型プログラミングを学ぶ
  • functional-javascript-workshop – このワークショップの目的は、短く、本質的で、慣用的なJavaScriptを使って解決可能な現実的な問題を提示することにより、JavaScriptの基本的な関数型プログラミング機能を教えることである
  • functional-frontend-architecture – 関数型フロントエンドフレームワーク。Ramda + union-type-js + Flyd + Snabbdomに基づく
  • cube-composer – 関数型プログラミングにインスピレーションを受けて作られたパズルゲーム。
  • FP Youtube Search – ReactJS、Redux、FP概念を用いたYouTube検索アプリ
  • Hardcore Functional Programming in JavaScript – 最先端のコンピュータサイエンス研究における技術を応用して、JavaScriptで実際の問題を解決する方法を学び、関数型プログラミングをステップバイステップで体験し、モナド、ファンクター、モノイド、アプリケイティブといった抽象インターフェースを使ってWebアプリケーションの構築方法を実際に見せる(commercial
  • Escape from Callback Mountain - Promiseベースの関数型JavaScriptの設計とリファクタリングに関するヒント。主な利点は読みやすさ、テスト可能性、再利用可能性である。MIT.
  • Learn Rx – 関数型リアクティブプログラミングの5つの基本要素を紹介するインタラクティブな練習シリーズ: mapfilterconcatAllreduce、およびzip関数。
  • Holdem Evaluator - もう一つのホールドエム評価器、ラムダの関数スタイルで

コミュニティ

関連リスト

チャット

貢献

:star: 提案とPRを歓迎します! :star:

最初にコントリビューションガイドラインをお読みください。

ライセンス

CC0

法律で認められる範囲で、Christoph Hermann は本作品に関するすべての著作権および関連する権利を放棄しています。