使用箭头创建自己的数据类型的步骤是什么。
使用Option
提供的扩展构造函数(如Some(data)
or )很简单None
。但是,如何创建自己的数据类型,它具有像map()
or这样的函数运算符flatMap()
?
在 Arrow 中创建符合 Type 类的数据类型Functor
并因此提供类似方法的步骤如下map
所述:
启用更高种类的模拟。https://arrow-kt.io/docs/patterns/glossary/#higher-kinds
实现类型类实例 https://arrow-kt.io/docs/patterns/glossary/#using-higher-kinds-with-typeclasses
在上面的两个链接中,有一个使用ListK
包装 std lib的示例List
。文档示例没有提到的是,为了扩展 Functor 将在 ListK 上添加的扩展,包括接口中定义的map
,lift
等,Functor
它需要 kapt 和箭头元。
kapt "io.arrow-kt:arrow-meta:$arrow_version"
Arrow meta 负责为类型类实例扩展 Higher Kinds 和 Extensions。当前扩展的一个限制是,如果您计划在同一个模块中同时使用两者@higherkind
,@extension
则由于 kapt 处理的顺序,它将无法工作。为此,您需要在一个模块中有数据类型,而在另一个模块中有扩展。这实际上是一种很好的做法,也是我们在 Arrow 中所遵循的,因为它允许用户在不需要扩展时按点菜方式导入数据类型。
如果我正确理解您的问题:
https://arrow-kt.io/docs/patterns/glossary/
请注意,注释处理器应该能够为您生成类型类实例。但从根本上说,您只需要决定您的数据类型将支持哪些类型类并为这些类型类提供实现。(请注意,类型类形成了继承层次结构,因此(例如)如果您实现 Monad,则(可能)需要实现 Functor。)