【问题标题】:Generating lenses with Kotlin Arrow library使用 Kotlin Arrow 库生成镜头
【发布时间】:2018-07-28 11:46:59
【问题描述】:

我正在阅读“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 注释时,找不到它。

@光学

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

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

这将创建一个Memory.Companion.size 镜头。

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

我的预感是正确的还是我在这里遗漏了什么?

【问题讨论】:

    标签: kotlin functional-programming arrow-kt


    【解决方案1】:

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

    我记得注释存在并且是“类别”的实验性添加(此后库被重命名为“箭头”)。出现时我找不到提交,因为库重组了很多次。但我确信它在重命名时是无证且高度实验性的功能。

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

    为什么改名

    “光学”比“镜头”更笼统。当它开始时,只有镜头(和部分棱镜)。目前光学包括:Lens、Iso、Traversal、Fold、Prism、Getter、Setter。您可以在文档中找到更多信息。之间我确信这本书是很好的来源,虽然它已经过时了。 The Arrows Docs 与许多其他不同语言的镜头库不同,对初学者非常友好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-20
      • 1970-01-01
      • 2020-03-20
      • 1970-01-01
      相关资源
      最近更新 更多