代码之家  ›  专栏  ›  技术社区  ›  Johan Vergeer

使用Kotlin箭头库生成透镜

  •  2
  • Johan Vergeer  · 技术社区  · 7 年前

    我在读“功能性角蛋白”,它描述了使用注释产生透镜的过程。

    @透镜

    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 透镜。

    因为我找不到 @透镜 注释,它让我想知道这是否是一个不推荐使用的实现。

    我的直觉是正确的还是我在这里遗漏了什么?

    1 回复  |  直到 6 年前
        1
  •  2
  •   vlastachu    6 年前

    你的问题实际上就是答案。批注已重命名。

    我记得这个注释存在,并且是“kategory”的实验性添加(从那时起,图书馆改名为“arrow”)。当提交出现时,我找不到它,因为库重新组织了多次。但我敢肯定,当它改名时,它是非文档化的、高度实验性的功能。

    这是这本书作者的错吗?我没有读过它,但对于Kotlin开发人员来说,这个特性非常有趣,也非常具有前瞻性,尽管它非常具有实验性。

    更改名称的原因

    “光学”比“透镜”更通用。当它开始时,只有透镜(和部分棱镜)。目前光学包括:透镜、ISO、横移、折叠、棱镜、吸气剂、照排机。您可以在文档中找到更多信息。我敢肯定这本书是很好的来源,尽管它已经过时了。 The Arrows Docs 与其他许多不同语言的镜头库不同,它对初学者非常友好。