预奏
全体 学分归原始创造者 prelude-ts
这只是一个已出版的版本, 并添加了多个
介绍
前作-t(前作前作-t)是一个TypeScript库,旨在使功能编程 概念在 TypeScript 中可以访问和生产。 注意,尽管它是 以 TypeScript 写成, 它完全可以从 JavaScript (包括 ES5) 中使用 !
它规定 持久性 不可移动的集合(Vector, Set, Map, Stream),以及诸如Option, 不管是Predicate还是未来.
Vector.of(1,2,3)
.map(x => x*2)
.head()
// => Option.of(2)
Option.sequence(
Vector.of(Option.of(1), Option.of(2)))
// => Option.of(Vector.of(1,2))
Vector.of(1,2,3,4).groupBy(x => x%2)
// => HashMap.of([0, Vector.of(2,4)],[1, Vector.of(1,3)])
Vector.of(1,2,3).zip("a", "b", "c").takeWhile(([k,v]) => k<3)
// Vector.of([1,"a"],[2,"b"])
HashMap.of(["a",1],["b",2]).get("a")
// Option.of(1)
收集器也是JavaScript traperables, 所以如果你有 ES6 运行时间,
您可以使用 for .. of 建在他们身上。 如果你不熟悉的话
不可改变的收藏, list.append(newItem) 保留 list 不变; append()
返回新列表。 不可改变性有助于代码的推理.
你可以检查 用户指南, (中文(简体) ),
浏览 API 文档, (中文(简体) ),
或者我们 博客。 。 。 .
注意构造器是私有的,你应该使用静态方法建造
(b) 诸如: Option.of, (中文(简体) ), Vector.of, (中文(简体) ), Vector.ofIterable,等等。 (笑声).
HashSet 财务报告和审定财务报表 HashMap 使用
HAMT 算法, (中文(简体) ),
具体来说 hunt plus 库。 。 。 .
Vector 通过一个
被比特映射的矢量 trie
具体来说 列表库页:1.
此外,库以平庸的JavaScript风格写出,并有回环
而不是重复,所以表现应该很好
(单位:千美元)参见此处基准与不可改变的.js 及更多) (中文(简体) ).
list 财务报告和审定财务报表 hamt_plus 是前奏的两个唯一依存.
设置、地图和平等
JavaScript除原始类型外没有结构上的平等.
这么说吧 1 === 1 是真的,不过 [1] === [1] 没有, 也不是 {a:1} === {a:1}。 。 。 .
这给收藏带来了问题,因为如果你有 Set你没有
由于平等的定义有限,想要重复要素.
因此,序曲鼓励您定义非原始类型
方法 equals(other: any): boolean 财务报告和审定财务报表 hashCode(): number (中文(简体) )
方法 不可移动.js 使用) (中文(简体) ).
通过这些方法,结构上的平等是可以实现的,而且事实上
Vector.of(1,2,3).equals(Vector.of(1,2,3)) 实值 true然而,这只能是
工作,如果您在收藏中的值本身有正确定义的平等
(单位:千美元)看前奏可以帮助什么) (中文(简体) ).
如果这些价值观没有结构上的平等,那么我们就不会比
=== 行为.
前奏试图协助程序员; 它试图鼓励
开发者做正确的事情。 它会拒绝类型 没有明显的正确
在 Sets 和 Maps 密钥中定义平等, 因此 HashSet.of([1]), (中文(简体) ),
或者说 Vector.of([1]).equals(Vector.of([2])) 将不编译.
对于这两个,你得到(一个更长的版本)这个消息:
Type 'number[]' is not assignable to type 'HasEquals'.
Property 'equals' is missing in type 'number[]'.
见 用户指南 更多细节.
安装
类型脚本必须知道 Iterable,一个 ES6 特性(但在大多数浏览器中存在)
来编译序曲。 如果您使用 TypeScript 和目标 ES5, 请最小修改您的 tsconfig.json
可添加:
"lib": ["DOM", "ES5", "ScriptHost", "es2015.iterable"]
(与默认的ES5设置相比,它只添加了"es2015. iteable")
用于节点.js
只要在您身上加上依赖 package.json 开始使用( 如
import { Vector } from "prelude-ts";,或 const { Vector } = require("prelude-ts");
如果你使用普通话的话.
一切都应该奏效,包括如果使用 TypeScript 进行类型检查。 前奏还提供了
在节点REPL中相当的打印.
使用浏览器
在您中添加依赖性 package.json; 类型脚本应自动
注册类型定义.
Npm 包包含文件 dist/src/prelude_ts.js 财务报告和审定财务报表 dist/src/prelude_ts.min.js, (中文(简体) ),
它们是UMD捆绑;它们与其他模块系统一起工作并设定 prelude_ts
如果没有模块系统,则作为窗口全局。 将相关内容包含在您的
脚本标签中的 index.html :
<script src="node_modules/prelude-ts/dist/src/prelude_ts.min.js"></script>
您不应该有问题 导入您的应用程序的序曲, 但如果您使用
模块会变得更加复杂 使用它们的一个解决方案是创建
a 一个 imports.d.ts 包含以下内容的文件 :
// https://github.com/Microsoft/TypeScript/issues/3180#issuecomment-283007750
import * as _P from 'prelude-ts';
export as namespace prelude_ts;
export = _P;
然后在一个 .ts 在模块之外,您可以做到:
import Vector = prelude_ts.Vector;
- 获取没有命名空间的值.
最后,如果您也包括 dist/src/chrome_dev_tools_formatters.js 结束
(单位:千美元) script 标签,以及 启用自定义格式化, (中文(简体) ),
这样你就可以得到
在 Chrome 调试器中很好的显示序曲值。 。 。 .
愿望清单/即将具备的特点
- CharSeq,一个字符串包装?
- 非空向量吗 ? (已经 非空链接列表(中文(简体) )
- 使用蹦床或类似技术
Stream避免堆栈溢出非常大溪流上的例外 - 现有类别上更多的功能
超出序曲范围
- 免费的僧侣
- 蒙德变压器
- 效果跟踪
- 高级类型模拟
我认为这些概念在语言上无法用足够好的方式表达 例如 TypeScript.
替代品和影响
- 货币.js - 只有一个
List财务报告和审定财务报表Option收藏,以功能式ES5执行. 执行情况, 使用再现,表示其列表类型明显比序曲的慢. - 不可改变.js - 没有
Option概念; 类型可以是 clunky. - 庇护
提供全球功能,例如
S.filter(S.where(...))而序曲则倾向于 流利的 API 风格list.filter(..).sortBy(...)而且,避难所不会 提供套装和地图。 另一方面,避难所有一些JS运行时间类型系统 支持,前奏没有. - 拉达克 提供全球功能,例如
R.filter(R.where(...))而序曲则倾向于 流利的 API 风格list.filter(..).sortBy(...)而且,拉姆达不提供 集和地图。 拉姆达也用咖哩从盒子里取出很多东西 可能不会 对一些开发者来说是直观的。 在序曲中, 咖喱声 打开 部分适用 选择进入. - 摇篮 也具有全球功能和许多功能 变异所集.
- 虚拟 - 这是一个爪哇文库,但它是序曲的主要灵感. 请注意Vavr是受斯卡拉图书馆的启发,所以序曲也是, 过渡性.
类型脚本版本
截至0.8.2,前奏需要TypeScript 3.1或更新.
图标
npm install
npm test
npm run-script docgen
npm run benchmarks