使用 Kotlin Arrow 库生成镜头
Generating lenses with Kotlin Arrow library
我正在阅读 "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
注释上找不到任何其他 material,这让我想知道这是否是一个已弃用的实现。
我的预感是正确的还是我遗漏了什么?
你的问题其实就是答案。注释已重命名。
我记得注释存在并且是对 "kategory" 的实验性添加(此后库更名为 "arrow")。当它出现时我找不到提交,因为库重组了很多次。但我确信它在重命名时是未记录的和高度实验性的功能。
这是本书作者的错吗?我没读过它,但该功能对 kotlin 开发人员来说非常有趣和有前景,尽管它是高度实验性的。
为什么改名
"Optics" 比 "Lenses" 更通用。当它开始时只有镜头(和部分棱镜)。目前光学包括:Lens、Iso、Traversal、Fold、Prism、Getter、Setter。您可以在文档中找到更多信息。我确信那本书是很好的来源,尽管它已经过时了。 The Arrows Docs 与许多其他不同语言的镜头库不同,它对初学者非常友好。
我正在阅读 "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
注释上找不到任何其他 material,这让我想知道这是否是一个已弃用的实现。
我的预感是正确的还是我遗漏了什么?
你的问题其实就是答案。注释已重命名。
我记得注释存在并且是对 "kategory" 的实验性添加(此后库更名为 "arrow")。当它出现时我找不到提交,因为库重组了很多次。但我确信它在重命名时是未记录的和高度实验性的功能。
这是本书作者的错吗?我没读过它,但该功能对 kotlin 开发人员来说非常有趣和有前景,尽管它是高度实验性的。
为什么改名
"Optics" 比 "Lenses" 更通用。当它开始时只有镜头(和部分棱镜)。目前光学包括:Lens、Iso、Traversal、Fold、Prism、Getter、Setter。您可以在文档中找到更多信息。我确信那本书是很好的来源,尽管它已经过时了。 The Arrows Docs 与许多其他不同语言的镜头库不同,它对初学者非常友好。