Как LINQ в С#, для понимания в Scala, что-нибудь подобное в Kotlin? Если не поддерживается, планируется ли это?
Поддерживает ли Котлин монадическое понимание?
Ответ 1
Специального ключевого слова (do/for) нет, и поэтому нет прямого перевода во вложенную flatMap (desugaring), как в других языках.
Но монадическое понимание может быть реализовано с сопрограммами.
Из документации Arrow: https://arrow-kt.io/docs/patterns/monad_comprehensions/#comprehensions-over-coroutines
Понимание сопрограмм
Эта функция известна под несколькими именами: async/await, сопрограммы, do notation, для понимания... каждая версия содержит определенные уникальные моменты, но все они основаны на одних и тех же принципах. В Kotlin сопрограммы (введенные в версии 1.1 языка) делают компилятор способным переписывать, казалось бы, синхронный код в асинхронные последовательности. Arrow использует эту возможность компилятора, чтобы вывести нотацию, подобную сопрограммам, во все экземпляры класса типов Monad.
Это означает, что все варианты доступны для Option, Try, List, Reader, Observable, Flux или IO.
Для сопрограмм см. Также "Глубокое погружение в сопрограммы на JVM @KotlinConf 2017": https://www.slideshare.net/elizarov/deep-dive-into-coroutines-on-jvm-kotlinconf-2017?next_slideshow=1
Ответ 2
В предпродажной версии Kotlin 1.1 существует универсальный синтаксис async
/await
, который может использоваться для разных типов монадических понятий:
Многие языки (начиная с С# в 2012 году) поддерживают асинхронные программирование через специальные языковые конструкции, такие как async/wait ключевые слова. В Котлине мы обобщили это понятие так, чтобы библиотеки могли определить их собственные версии таких конструкций, а асинхронный ключевое слово, а просто функция.
Эта конструкция позволяет интегрировать различные асинхронные API: фьючерсы / promises, обратный вызов и т.д. Это также достаточно общее для выражают ленивые генераторы (выход) и охватывают некоторые другие варианты использования.