使用Kotlin Arrow库生成镜头

时间:2018-07-28 11:47:00

标签: kotlin functional-programming arrow-kt

我正在阅读“功能性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 个答案:

答案 0 :(得分:2)

您的问题实际上是答案。注释已重命名。

据我所知,注释存在并且是“类别”的实验性添加(此后库被重命名为“箭头”)。由于库已多次重组,因此在出现提交时找不到提交。但是我敢肯定,在重命名时,它是未记录的且具有高度实验性的功能。

那是本书作者的错吗?我没有读过它,但是该功能对于kotlin开发人员来说非常有趣且具有远见,尽管那是高度实验性的。

名称更改的原因

“光学”比“透镜”更笼统。当它开始时,只有镜头(和部分棱镜)。目前,光学器件包括:镜头,Iso,遍历,折叠,棱镜,吸气剂,塞特镜。您可以在文档中找到更多信息。在两者之间,我确信这本书虽然过时了,但却是不错的来源。 The Arrows Docs非常适合初学者,这与许多其他使用不同语言的镜头库不同。