如何使用 Arrow 创建自己的数据类型

How do I create my own data type with Arrow

使用箭头创建自己的数据类型的步骤是什么。

Option 与提供的扩展构造函数(如 Some(data)None 一起使用很简单。但是,如何创建自己的数据类型,它具有 map()flatMap() 等函数运算符?

如果我没有正确理解你的问题:

https://arrow-kt.io/docs/patterns/glossary/

请注意,注释处理器应该能够为您生成类型类实例。但从根本上说,您只需要决定您的数据类型将支持哪些类型类并为这些类型类提供实现。 (请注意,类型类形成继承层次结构,因此(例如)如果您实现 Monad,您(可能)需要实现 Functor。)

在 Arrow 中创建符合类型 class 的数据类型(如 Functor 并因此提供如 map 的方法的步骤概述如下:

  1. 启用更高类型的仿真。 https://arrow-kt.io/docs/patterns/glossary/#higher-kinds

  2. 实现类型class实例 https://arrow-kt.io/docs/patterns/glossary/#using-higher-kinds-with-typeclasses

在上面的两个链接中有一个使用 ListK 包装标准库 List 的示例。文档示例没有提到的是,为了扩展 Functor 在 ListK 上添加的扩展,包括 maplift 等,如 Functor 接口中定义的,它需要 kapt 和箭头元

kapt    "io.arrow-kt:arrow-meta:$arrow_version"

Arrow meta 负责扩展 Higher Kinds 和 Extensions 类型 class instances。当前扩展中的一个限制是,如果您计划在同一个模块中同时使用 @higherkind@extension,由于 kapt 处理的顺序,它将无法工作。为此,您需要在一个模块中使用数据类型,在另一个模块中使用扩展。这实际上是一种很好的做法,也是我们在 Arrow 中遵循的做法,因为它允许用户在不想要扩展时按需导入数据类型。