Генерация линз с помощью библиотеки Kotlin Arrow
Я читаю "Функциональный Котлин", который описывает генерацию линз с помощью аннотаций.
@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 ответ
Ваш вопрос на самом деле является ответом. Аннотация была переименована.
Насколько я помню, аннотация существовала и была экспериментальным дополнением для "категории" (с тех пор библиотека была переименована в "стрелку"). Я не могу найти коммит, когда он появился, потому что библиотека реорганизовалась много раз. Но я уверен, что это была недокументированная и очень экспериментальная функция, когда она была переименована.
Это вина авторов книги? Я не читаю его, но эта функция была очень интересной и перспективной для разработчиков kotlin, хотя и очень экспериментальной.
Почему имя было изменено
"Оптика" является более общим термином, чем "линзы". Когда это началось, были только Линзы (и частично Призма). На данный момент оптика включает в себя: линзу, изо, обход, сгиб, призму, геттер, сеттер. Вы можете узнать больше информации в документах. Между прочим, я уверен, что эта книга - хороший источник, хотя и устарел. Документы Arrows Docs очень удобны для начинающих, в отличие от многих других линз-библиотек на разных языках.