Fpdart
Dart 和 Flutter 中的函数式编程。所有主要的函数式编程类型和模式都经过全面文档化、测试并附有示例。
Fpdart 已有完整的文档。您无需具备任何函数式编程经验即可开始使用
fpdart。快来试试吧!
Fpdart 受到 fp-ts、cats 和 dartz 的启发。
注意:该软件包仍处于早期开发阶段。API 可能会频繁更改,并且会进行许多重大更改。文档和测试目前正在开发中,但正在快速推进。请关注我的 Twitter 以获取每日更新。
? 学习 函数式编程 和 fpdart
您想了解更多关于函数式编程、fpdart 以及如何使用该软件包的信息吗?请查看这一系列关于使用 fpdart 进行函数式编程的文章。
- Fpdart,Dart 和 Flutter 中的函数式编程
- 如何在您的 Dart 和 Flutter 应用中使用 fpdart 函数式编程
- 纯函数式 Flutter 应用 – 使用 fpdart 和函数式编程的 Pokemon 应用
- 函数式编程 Option 类型 – 简介
- 使用 Option 类型链式调用函数 – 函数式编程
- 实践函数式编程 – 第一部分
- 实践函数式编程 – 第二部分
- 实践函数式编程 – 第三部分
? 类型
-
选项 -
Either -
单位 -
任务 -
TaskEither -
状态 -
StateAsync -
阅读器 -
Tuple -
IO -
Iterable(List)扩展 -
Map扩展 -
IOEither -
TaskOption -
Predicate -
ReaderEither -
ReaderTask -
ReaderTaskEither -
StateReaderTaskEither -
Lens -
Writer
? 安装
# pubspec.yaml
dependencies:
fpdart: ^0.0.11 # Check out the latest version
✨ 示例
Option
/// Create an instance of [Some]
final option = Option.of(10);
/// Create an instance of [None]
final none = Option<int>.none();
/// Map [int] to [String]
final map = option.map((a) => '$a');
/// Extract the value from [Option]
final value = option.getOrElse(() => -1);
/// Pattern matching
final match = option.match(
(a) => print('Some($a)'),
() => print('None'),
);
/// Convert to [Either]
final either = option.toEither(() => 'missing');
/// Chain computations
final flatMap = option.flatMap((a) => Option.of(a + 10));
/// Return [None] if the function throws an error
final tryCatch = Option.tryCatch(() => int.parse('invalid'));
Either
/// Create an instance of [Right]
final right = Either<String, int>.of(10);
/// Create an instance of [Left]
final left = Either<String, int>.left('none');
/// Map the right value to a [String]
final mapRight = right.map((a) => '$a');
/// Map the left value to a [int]
final mapLeft = right.mapLeft((a) => a.length);
/// Return [Left] if the function throws an error.
/// Otherwise return [Right].
final tryCatch = Either.tryCatch(
() => int.parse('invalid'),
(e, s) => 'Error: $e',
);
/// Extract the value from [Either]
final value = right.getOrElse((l) => -1);
/// Chain computations
final flatMap = right.flatMap((a) => Either.of(a + 10));
/// Pattern matching
final match = right.match(
(l) => print('Left($l)'),
(r) => print('Right($r)'),
);
/// Convert to [Option]
final option = right.toOption();
Reader
请查看 example folder for an explained usecase example 了解解释性的用例示例。
State
请查看 example folder for an explained usecase example 了解解释性的用例示例。
? 不可变集合
Fpdart 提供了一些 Iterable (List) 和 Map 的扩展方法,通过提供一些函数式编程签名(安全的方法,从不修改原始集合且从不抛出异常)来扩展可用方法。
不可变集合(IList、ISet、IMap 等)的集成仍在与社区讨论中。fpdart 不想成为生态系统中又一个不可变集合解决方案。因此,我们正在努力将 fpdart 与其他更成熟的、已实现不可变集合的软件包集成。敬请期待!
更多
更多示例即将推出。请查看 我的网站 和我的 Twitter 以获取每日更新。
? 动机
函数式编程越来越受欢迎,而且是有原因的。
许多非函数式语言正在缓慢采用函数式语言的模式,Dart 也包括在内。Dart 已支持高阶函数、泛型类型、类型推断。其他函数式编程特性也即将添加到该语言中,例如 模式匹配、解构、多返回值、高阶类型。
许多软件包正在为 Dart 带来函数式模式,例如用于联合/模式匹配的出色 freezed。
Fpdart 旨在将函数式语言中的所有主要类型引入 Dart。例如 Option(无需 null 即可处理缺失值)、Either(处理错误和错误消息)、Task(可组合的异步计算)等类型。
目标
与许多其他函数式编程软件包不同,fpdart 旨在将函数式编程介绍给所有开发者。因此,所有类型和方法都直接在代码中进行了注释和记录。
您无需具备任何函数式编程经验即可开始使用
fpdart。
Fpdart 还提供了 真实世界的示例,说明某个类型为何有用以及如何在您的应用程序中使用它。请访问 我的网站 查看博客文章和教程。
与 dartz 的比较
dartz 一直以来的主要痛点之一是其 缺乏文档。这对于函数式编程新手来说是一个巨大的障碍,难以尝试使用该软件包。
dartz 于 2016 年发布,最初针对 Dart 1。
dartz 还缺少一些功能和类型(Reader、TaskEither 等)。
Fpdart 是基于 fp-ts 和 cats 重写的。主要区别在于:
- Fpdart 已完全文档化。
- Fpdart 使用 defunctionalization 实现高阶类型。
- Fpdart 基于 Dart 2。
- Fpdart 从一开始就完全 null-safe。
- Fpdart 拥有更丰富的 API。
- Fpdart 在 dartz 中实现了某些缺失的类型。
- Fpdart(目前)不提供不可变集合(
ISet、IMap、IHashMap、AVLTree)的实现。
? 路线图
作为软件包的重要目标,文档和稳定性非常重要,每个类型都将经过实现-文档-测试的周期,才能被认为是“稳定”的。
类型开发的路线图如下所示(在此早期阶段,可能会出现对“稳定”类型的重大更改)。
选项实施文档测试
Either实施文档测试
单位实施文档测试
任务实施文档测试
TaskEither实施文档测试
Tuple实施文档测试
状态实施文档测试
阅读器实施文档测试
IO实施文档测试
IOEither实施文档测试
TaskOption实施文档测试
ReaderEither- 实施
- 文档
- 测试
ReaderTask- 实施
- 文档
- 测试
ReaderTaskEither- 实施
- 文档
- 测试
StateReaderTaskEither- 实施
- 文档
- 测试
Writer- 实施
- 文档
- 测试
Lens- 实施
- 文档
- 测试
长期目标是提供其他函数式编程语言和软件包中的所有主要类型和类型类。所有类型都应 **完全** 文档化并经过充分测试。
易于理解的文档是项目长期成功的关键。 **任何文章、博客或贡献都受到欢迎**。
总的来说,**任何贡献或反馈都受到欢迎**(并鼓励!)。
? 许可证
MIT 许可证,有关详细信息,请参阅 LICENSE.md 文件。