Невозможно подтвердить приостановленный блок, переданный для forEach

Учитывая некоторые

suspend fun a(): Int 

Это работает:

 launch(Unconfined) { (1..10).forEach { val a = a() println("Result is $a") } } 

Но это не удается во время компиляции:

 val action: (Int) -> Unit = { // Suspend function should be called only from a coroutine // or another suspend function: val a = a() println("Result is $a") } launch(Unconfined) { (1..10).forEach(action) } 

Кроме того, он не может быть исправлен, потому что:

 val action: suspend (Int) -> Unit = { val a = a() println("Result is $a") } launch(Unconfined) { // suspend (Int) -> Unit cannot be applied to (T) -> Unit (1..10).forEach(action) } 

Какова история здесь с точки зрения системы статического типа? Текущая ситуация выглядит как быстрый хак, когда встроенный блок, содержащий suspend fun вызов, все еще выведен на подпись без приостановки.

Является ли это областью, где дизайн будет улучшен до того, как он будет завершен?

suspend и нормальные функциональные типы не являются подтипами друг друга и поэтому не могут быть назначены или переданы функции вместо друг друга:

 val f: () -> Unit = { } val g: suspend () -> Unit = f // Type mismatch val f: suspend () -> Unit = { } val g: () -> Unit = f // Type mismatch 

Вот почему suspend (Int) -> Unit не может быть передан в forEach .

В принципе, ограничение на приостановку функций, вызываемых только в других функциях приостановки, работает независимо от системы типов. Такие вызовы должны быть просто помещены в функцию приостановки или приостановить лямбду или вставить в нее. Таким образом, это также должно работать:

 val action: suspend (Int) -> Unit = { val a = a() println("Result is $a") } launch(Unconfined) { (1..10).forEach { action() } // The call is inlined into a suspend lambda } 

Я подал вопрос о поддержке (1..10).forEach(action) : KT-22186

Intereting Posts
Объявление байта в Kotlin делает ошибку времени компиляции «Целочисленный литерал не соответствует ожидаемому типу Byte» Dagger2 + Kotlin, инъекция не работает Kotlin Exposed не совершает транзакции База данных Android для Android – неразрешенная ссылка @Entity и другие аннотации В чем причина «неразрешенной ссылки» при использовании kotlin для FacebookLogin? Использование задач ant от gradle-script-kotlin Компилировать код kotlin как для JVM, так и для JavaScript BDD на Android с Kotlin Klaxon: Ожидалось имя, но получил LEFT_BRACE Kotlin – добавление элементов в ExpandableListView Только первый тест проходит с TestScheduler при запуске нескольких тестов (Kotlin) Необходимо получить абсолютный путь к веб-странице с помощью Java Изображение существует, но не null, но я получаю исключение NullPointerException Тесты эспрессо с Котлином Неразрешенная ссылка: Kotlin нуждается в 2 сборках после очистки, чтобы получить код при использовании kapt