Генерация линз с помощью библиотеки 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 очень удобны для начинающих, в отличие от многих других линз-библиотек на разных языках.

Другие вопросы по тегам