Functional Programming

Awesome FP JS Awesome

这是一个很棒的精选清单 functional programming JavaScript的代码和学习资源. 作为一种多范例编程语言,JavaScript可以用多种样式编写. 借助这些资源,我们希望帮助您更好地利用JavaScript对以_functional_方式编写程序的支持.

函数式编程是 style of programming 该模型将计算建模为表达式的求值. 与命令式编程相反,命令式编程中的程序由在执行时更改全局状态的语句组成. 函数式编程通常避免使用可变状态,而倾向于_side-free free_函数和_immutable_ data. 这鼓励编写易于推理的可组合和声明式程序.

Tags

这些可以附加到条目中. 每个标签之前都应加一个“ +”或“-”,以指示标签含义的存在或不存在. 仅当“-”标签有可能帮助某人过滤其需求的库时,才应包括它们. 例如,-TS标签可能对Typescript用户筛选类型有用,但是-CT标签对任何人的帮助都不太可能.

  • CT. 范畴论. 该库似乎受Haskell,Scala或另一种基于类别理论的功能语言库的启发.
  • TS. 打字稿. 该库具有打字稿类型.

Libraries

  • Ramda –一个实用的JavaScript函数库,专门针对函数式编程风格而设计. 一种易于创建功能管道且永不突变用户数据的样式. + TS.
  • Ramda Adjunct 是Ramda的社区维护扩展.
  • Ramda-extension 是仅由Ramda函数组成的实用程序无点函数集.
  • Rambda -低于10kB的Ramda替代产品.
  • Rambdax -Rambda的扩展版本
  • Folktale – JavaScript函数编程的标准库. 预计将于2020年中期提供打字稿支持. -TS.
  • lodash/fp –的实例 Lodash 其方法可以包装成不变的,自动处理的,迭代优先,数据后处理的方法. + TS.
  • functional.js –轻量级的功能性JavaScript库,有助于进行currying和无点/默认编程.
  • 101 –一个现代的模块化JavaScript实用程序库,可以很好地与普通JavaScript方法配合使用. -TS
  • fnuc – CoffeeScript(和JavaScript)的功能库,可促进功能组合和高阶功能.
  • barely-functional –使用本地ES5 / 6操作的微型(2.7kb)功能编程库. -TS.
  • bluebird-promisell -一个实用的函数式编程库,用于promise.
  • prelude.ls –某种程度上基于Haskell的Prelude模块的面向功能的实用程序库. -TS.
  • preludejs -适用于JavaScript的核心函数式编程. -TS.
  • 1-liners –功能工具再简单不过了. 一条简单而实用的实用皮带,充满爱与关怀. -TS.
  • fn-curry –简化功能的简单功能.
  • curry –使用函数绑定语法来编写函数.
  • compose-function –从较小的功能组成新功能.
  • functionize –有助于使非功能库正常运行的功能集合.
  • lambdajs –完整的ECMAScript API发挥了功能性的作用.
  • fp-dom –使DOM起作用.
  • react-on-lambda -将React中的JSX替换为函数(currying,composition等).
  • trifl –具有单向数据流和虚拟dom的功能用户界面库.
  • funcy –将功能模式匹配添加到JavaScript的实验. experimental:triangular_flag_on_post:
  • date-fp –一个用于处理JavaScript日期的实用工具库. date-fp中的所有函数都是纯函数,它们是自动运行的,并且不会改变它们所应用的日期对象.
  • js-joda –一个不变的日期和时间库,它基于ISO8601日历提供了一个简单的,由域驱动且干净的API.
  • _part_ –一个微型库,通过将本机方法用作部分应用的函数来鼓励函数编程.
  • claire –基于属性的测试库,用于明确指定代码不变性和行为.
  • FPO.js – Kyle Simpson的JavaScript FP库(又名getify). 支持命名参数样式方法.
  • Javascript Parser Combinator –受Haskell的Parsec启发的Javascript解析器组合器实现
  • fun-task –用于管理JS中的异步代码的抽象. 任务与承诺类似,主要区别在于任务可以代表计算,而承诺只能代表计算结果. 附带流类型定义.
  • most –超高性能反应式编程,可帮助您在值和事件流上编写异步操作,而无副作用和可变共享状态的许多危害.
  • zen-signals – possible最简单的信号库
  • funfix – Funfix是JavaScript,TypeScript和Flow中用于函数式编程的类型类和数据类型的库. + CT,+ TS.
  • pico-lambda -数组,字符串和事物的功能方式. 基于本地方法的640b功能库. -TS.
  • pareto-js -一个非常小的,直观且快速的JavaScript -TS功能实用程序库.
  • fpEs -一个小的库提供了基本FP和模式匹配/求和和MonadIO / Rx以及Java可选的简单用法. -TS.
  • Creed –具有先进功能的复杂且功能意识强的异步程序:协程,promise,ES2015可迭代对象,幻想世界. -TS.
  • TGrid -网格计算框架,网络和线程扩展 TSTL ,支持RFC(远程功能调用). + TS.
  • Ferrum –迭代器库,支持对象作为可迭代对象,惰性评估和pipe(); 在JS中实现特性(来自Rust)/类型类(来自Haskell). -TS.
  • fp-ts -TypeScript中的类型化函数式编程. + CT,+ TS.
  • iter-tools -丰富的工具集,可用于同步和异步迭代. + TS.
  • remeda 一个函数库大致取代了Ramda,但使用Typescript编写,因此更加易于使用. + TS.
  • futil-js -可以想象是像lodash / fp这样的库的一部分的功能实用程序的集合,但是由于某些原因或其他原因而没有.
  • rubico -[a]同步功能语法
  • rocket-pipes -强大的管道,可以像流行的FP库中的Maybe或Either一样链接Promise和ADT. + TS
  • omg-curry - Comprehensive Curry Library with Operator Curry, Curry from functions, Decurry and Infifnite Curries.

Data Structures

通过使用正确的任务数据结构来编写高性能的功能代码.

  • Icepick 将冻结的JavaScript对象视为持久性不可变集合的实用程序
  • Immutable.js –不可变的持久数据收集.
  • Immer – Immer是一个很小的程序包,用于基于写时复制机制的不可变状态. + TS.
  • Mori –从舒适的JavaScript角度出发,ClojureScript的持久数据结构和支持API.
  • Baobab –带有游标的持久且可选的不可变数据树.
  • immutable-sequence.js –基于JavaScript的不可变序列的高性能实现,基于 Finger Trees.
  • Timm –具有快速读取和可接受写入的不变性帮助器.
  • Lazy.js –实用程序库,在后台具有懒惰的引擎,它力求尽可能少地工作,同时要尽可能地灵活.
  • DerivableJS – JavaScript和TypeScript的功能性反应状态. DerivableJS使您可以对状态位之间的关系进行优雅的声明性声明. + TS.
  • imlazy –使用ES2015迭代协议创建和处理惰性可迭代对象的库.
  • collectable –适用于现代JavaScript和TypeScript应用程序的超高性能不可变数据结构. + TS.
  • List -具有全面功能API的极其快速的不可变列表.
  • prelude.ts -不可变的持久性集合,功能构造(例如Option和Either)以及组合器. 以Typescript实现,但也支持javascript. + CT,+ TS.
  • TSTL -C ++ STL(标准模板库)在TypeScript中实现. 提供遵循功能性编程规则的STL容器,迭代器,算法和函子. + TS.

Algebraic Data Types

使用数学定律,而不是总是重新发明自己的东西. 代数!

  • Fantasy Land –不是图书馆,而是要遵循的Monad法律规范.
  • Static Land –规范类似于Fantasy Land,但基于静态方法而非实例方法.
  • immutable-ext –的FantasyLand扩展 Immutable.js.
  • daggy –用于创建标记的构造函数的库.
  • Sanctuary –使用Sanctuary可以编写无空检查的安全代码. + CT,+ TS.
  • monet.js –通过提供丰富的Monad和其他有用功能来辅助功能编程的库. + CT,+ TS.
  • union-type –一个小的JavaScript库,用于定义和使用联合类型.
  • freeky –自由单子的集合.
  • Fluture –包含控制实用程序,高性能和出色错误消息的Future库.
  • fantasy-combinators –通用组合器.
  • fantasy-birds – Haskell软件包Data.Aviary.Birds的端口. 满足您组合需求的一切.
  • crocks –流行的代数数据类型的集合,其主要目标是策划和提供每种类型之间的通用接口,并提供启动所需的所有辅助功能. -TS.
  • kudo-js -小型实用程序库,带有一组代数数据类型和Helper函数,可帮助您以Java脚本中的功能性编程风格编写代码
  • purify -专注于ADT的TypeScript功能编程库. + CT,+ TS.
  • MojiScript-一种异步优先,自以为是的功能语言,旨在与JavaScript引擎100%兼容
  • Pratica -小型,简单,易用的FP数据类型,适合需要快速交付可靠代码的务实且高效的开发人员. + CT,+ TS.
  • Tifi -Tifi是用于TypeScript功能编程的库. 它解决了同时存在“未定义”和“空”的问题. Tifi的灵感来自OCaml / Reason实用程序的选项数据类型. + CT,+ TS.

Lenses

  • lenses –可组合 kmett 风格的镜片.
  • optics –发射器光学器件(透镜,棱镜,iso).
  • ramda-lens –:ram::mag_right:建立在Ramda上的镜头库.
  • fantasy-lenses –可组合的,不可变的获取器和设置器. (Profunctor镜头WIP)
  • nanoscope –有点支撑的镜头.
  • partial.lenses –部分镜头是一个用于JavaScript的全面,高性能的光学库.
  • shades –受lodash启发的类似镜头的Java库.

Functional Languages that Compile to JavaScript

  • ClojureScript –编译 Clojure,这是一种托管的Lisp,具有不变的持久数据结构,适用于JavaScript.
  • Elm –一种类型安全的功能编程语言,用于声明性创建基于Web浏览器的图形用户界面. 在Haskell中实现.
  • Fable -编译 F# 可读的JavaScript.
  • PureScript –一种小的强类型编程语言,可编译为JavaScript.
  • Idris –具有相关类型的通用纯函数编程语言.
  • GHCJSHaskell 基于GHC的JavaScript编译器.
  • ElixirScript –编译以下内容的子集 Elixir,一种动态,功能性语言,旨在为JavaScript构建可扩展和可维护的应用程序.
  • Js_of_ocaml –编译 OCaml 字节码转换为JavaScript,从而可以在浏览器中运行OCaml程序.
  • Reason – Reason是OCaml的新接口,OCaml是ML语言的一种高度表达的方言,具有类型推断和静态类型检查功能.
  • ReScript –(以前称为 Bucklescript)ReScript是一种类型安全的语言,可编译为最高质量的干净,可读和高性能的JavaScript代码.
  • Scala.js –编译 Scala 到JavaScript.
  • LiveScript – LiveScript具有到JavaScript的直接映射,并允许您编写没有重复样板的表达代码.
  • Quack -一种针对PHP和JS的具有渐进式和鸭子式输入的多范例编程语言.
  • ion -没有BS JS
  • RamdaScript -在RamdaJS之上编译为自以为是的JavaScript的Lisp
  • RacketScript – RacketScript旨在充分利用JavaScript和Racket的生态系统,并使它们之间的互操作性整洁流畅.
  • Koka – Koka是一种面向函数的编程语言,使用熟悉的JavaScript(如语法)将纯值与副作用计算分开.
  • TypeScript -TypeScript是JavaScript的类型化超集,可编译为纯JavaScript.

Programming Tools

  • eslint-plugin-fp -函数式编程的ESLint规则
  • 4.5 –功能断言库. 如果您更喜欢JavaScript中的函数式API和实践,则此库旨在通过惰性和单函数的面向函数的断言来解决此问题.
  • hm-def –具有Hindley Milner签名的JS的运行时类型检查.
  • ftor -可插入的运行时类型检查器和功能调试工具,可通过Scott Encoding支持参数和行多态性,隐式rank-2类型和代数数据类型.

Resources

Books

  • Professor Frisby’s Mostly Adequate Guide to Functional Programming –这是一本关于函数范式的书,该书通常使用世界上最流行的函数编程语言:JavaScript. 这是一个实用的介绍,它通过实际示例建立了直觉. 强烈推荐. 通过 Brian Lonsdorf (2016)
  • Functional-Light JavaScript –本书探讨了可应用于JavaScript的函数式编程(FP)的核心原理. 但是使本书与众不同的是,它在没有所有繁重术语的情况下就遵循了这些原理.
  • JavaScript Allongé ,“第六”版. 尽可能少地介绍功能,但也要少! –并建立强大的组合器和装饰器. 基础书. 通过 Reginald Braithwaite (2016)
  • Functional Programming in JavaScript 向JavaScript开发人员讲授可改善可扩展性,模块化,可重用性,可测试性和性能的功能技术. 通过具体的示例和无术语的解释,这本书教您如何将函数式编程应用于实际的开发任务. 路易斯·阿滕西奥(2016)
  • Eloquent JavaScript . 使用JavaScript进行编程的现代介绍. 玛丽恩·哈弗贝克(Marijn Haverbeke)(2014)
  • Functional JavaScript 讲授如何使用JavaScript的函数式编程支持创建美观,安全,易于理解和测试的代码. 通过 Michael Fogus (2013)
  • Grokking Simplicity 从第一原理讲授函数式编程. 它对所有代码示例均使用JavaScript,并使用实际场景. 通过 Eric Normand (2019)
  • scriptum -简洁的功能编程库和基于该库的在线课程

Articles

Videos

Examples and Exercises

  • 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中的实际问题. 探索函数式编程,并逐步演示了如何使用Monads,Functor,Monoids和Applicatives等抽象界面构建示例Web应用程序. (commercial
  • Escape from Callback Mountain -基于Promise的功能JavaScript的设计和重构技巧. 主要好处包括更好的可读性,可测试性和可重用性. 麻省理工学院.
  • Functional Programming for Beginners –数十种练习,包括解决方案和解释.
  • Learn Rx –一系列互动练习,介绍功能性(反应性)编程的五个基本要素:“ map”,“ filter”,“ concatAll”,“ reduce”和“ zip”功能.
  • Holdem Evaluator -另一个具有Ramda功能风格的Holdem评估器

Community

Talk

Contribution

:star:欢迎提出建议和PR! :星:

请阅读 contribution guidelines 开始.

License

CC0

在法律允许的范围内, Christoph Hermann 放弃了此作品的所有版权以及相关或邻近的权利.