Functional Programming

Awesome FP JS Awesome

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

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

Libraries

  • Ramda – JavaScript的实用功能库,专门为功能编程风格设计. 一种易于创建功能管道且从不更改用户数据的样式.
  • Ramda Adjunct 是Ramda的社区维护扩展.
  • Ramda-extension 是仅由Ramda函数组成的实用程序无点函数集.
  • Rambda -低于10kB的Ramda的更快替代方案.
  • Folktale – JavaScript函数编程的标准库.
  • lodash/fp –的实例 Lodash 其方法可以包装成不变的,自动处理的,迭代优先,数据后处理的方法.
  • functional.js –轻量级的功能JavaScript库,有助于进行渐进式和无点/隐式编程.
  • 101 –一个现代的模块化JavaScript实用程序库,可以很好地与普通JavaScript方法配合使用.
  • fnuc – CoffeeScript(和JavaScript)的功能库,可促进功能组合和高阶功能.
  • barely-functional –使用本地ES5 / 6操作的微型(2.7kb)功能编程库.
  • bluebird-promisell -一个实用的函数式编程库,用于promise.
  • prelude.ls –面向功能的实用程序库,该程序库基于Haskell的Prelude模块.
  • preludejs -适用于JavaScript的硬核函数式编程.
  • 1-liners –不可能简单的功能性工具. 一条简单而实用的实用皮带,充满爱与关怀.
  • 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 – An immutable date and time library that provides a simple, domain-driven and clean API based on the ISO8601 calendar.
  • _part_ –一个微库,通过将本机方法用作部分应用的函数来鼓励函数编程.
  • claire –基于属性的测试库,用于明确指定代码不变性和行为.
  • FPO.js – Kyle Simpson的JavaScript FP库(又名getify). 支持命名参数样式方法.
  • Javascript Parser Combinator –受Haskell的Parsec启发的Javascript解析器组合器实现
  • fun-task – An abstraction for managing asynchronous code in JS. Tasks are similar to Promises with the key difference that Tasks can represent a computation while Promises can represent only the results of a computation. Ships with Flow type definitions.
  • most –超高性能反应式编程,可帮助您在值和事件流上编写异步操作,而没有副作用和可变共享状态的许多危害.
  • zen-signals – possible最简单的信号库
  • funfix – Funfix是JavaScript,TypeScript和Flow中用于函数式编程的类型类和数据类型的库.
  • pico-lambda -数组,字符串和事物的功能方式. 基于本地方法的640b功能库.
  • pareto-js -一个非常小巧,直观且快速的JavaScript功能实用程序库
  • fpEs -一个小型库提供基本FP和模式匹配/求和和MonadIO / Rx的简单用法,以及Java脚本的可选
  • Creed –具有高级功能的复杂且功能意识强的异步程序:协程,promise,ES2015可迭代对象,幻想世界.
  • TGrid -网格计算框架,网络和线程扩展 TSTL,支持RFC(远程功能调用).
  • Ferrum –迭代器库,支持对象作为可迭代对象,惰性评估和pipe(); 在JS中实现特性(来自Rust)/类型类(来自Haskell)
  • fp-ts -TypeScript中的类型化函数式编程

Data Structures

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

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

Algebraic Data Types

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

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

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程序.
  • BuckleScript –的JavaScript后端 the OCaml compiler.
  • Reason – Reason是OCaml的新接口,OCaml是ML语言的一种高度表达的方言,具有类型推断和静态类型检查功能.
  • 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)

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 - Design & refactoring tips for Promise-based Functional JavaScript. Key benefits include better readability, testability, and reusability. MIT.
  • Functional Programming for Beginners –数十种练习,包括解决方案和解释.
  • Learn Rx –一系列互动练习,介绍功能性(反应性)编程的五个基本要素:“ map”,“ filter”,“ concatAll”,“ reduce”和“ zip”功能.
  • Holdem Evaluator -另一个具有Ramda功能风格的Holdem评估器

Community

Talk

Contribution

:star:欢迎提出建议和公关! :星:

请阅读 contribution guidelines 开始.

License

CC0

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