首页 文章

使用Kotlin Arrow库生成镜头

提问于
浏览
2

我正在阅读“Functional Kotlin”,它描述了使用注释生成镜头 .

@lenses

import arrow.lenses
import arrow.optics.Lens
import arrow.optics.modify

typealias GB = Int
@lenses data class Memory(val size: GB)
@lenses data class MotherBoard(val brand: String, val memory: Memory)
@lenses data class Laptop(val price: Double, val motherBoard: MotherBoard)

fun main(args: Array<String>) {
    val laptopX8 = Laptop(500.0, MotherBoard("X", Memory(8)))
    val laptopMemorySize: Lens<Laptop, GB> = laptopMotherBoard() compose
motherBoardMemory() compose memorySize()
    val laptopX16 = laptopMemorySize.modify(laptopPrice().set(laptopX8, 780.0)) { size ->
        size * 2
    }
    println("laptopX16 = $laptopX16")
}

Arrow生成与我们的数据类具有的构造函数参数一样多的镜头,名称为 classProperty ,并且在同一个包中,因此不需要额外的导入

但是,当我尝试使用 @lenses 注释时,找不到它 .

@optics

在Arrow文档中,我注意到他们使用 @optics 注释

@optics data class Memory(val size: GB) {
  companion object
}

这将创造一个 Memory.Companion.size 镜头 .

由于我无法在 @lenses 注释上找到任何其他材料,因此我想知道这是否是一个弃用的实现 .

我的预感是正确还是我错过了什么?

1 回答

  • 2

    你的问题实际上是答案 . 注释已重命名 .

    我记得那里存在注释,并且是“kategory”的实验性补充(因此,库被重命名为“箭头”) . 因为图书馆重组多次而无法找到提交 . 但我确信它在重命名时是非文档和高度实验性的功能 .

    这是本书作者的错吗?我不读它,但这个功能对于kotlin开发人员来说非常有趣和透视,尽管这是非常实验性的 .

    Why name was changed

    "Optics"是比"Lenses"更通用的术语 . 当它开始时,只有镜头(和部分棱镜) . 目前光学包括:镜头,Iso,Traversal,Fold,Prism,Getter,Setter . 您可以在文档中找到更多信息 . 我确定这本书虽然过时了,但它确实很好 . The Arrows Docs非常适合初学者,与其他许多不同语言的镜头不同 .

相关问题