Невозможно подтвердить приостановленный блок, переданный для 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
LMAX Disruptor с Kotlin: нельзя использовать лямбда? Тип союза между Any? и блок Автоматическое обновление версии библиотеки для проектов Gradle в настоящее время не поддерживается. Обновите файл build.gradle вручную. Как преобразовать intArray в ArrayList <Int> в Котлин? Запечатанный класс данных в Котлине Использование Kotlin для передачи изображения из ImageView в другую активность на Android Попросите класс Non-Generic использовать общий аргумент в конструкторе Использование Kotlin в сопутствующем объекте вызывает непредвиденную ошибку Котлин не может получить доступ к защищенному абстрактному методу Как использовать KeyEvent в Котлине Смешанная Kotlin + Java с Maven, неразрешенная ссылка Kotlin неразрешимая ссылка в IntelliJ Создайте текущую функцию генерации с помощью RxJava2 Как объединить 2 отдельных потока, буферизовать заполненные данные из них и subsrcibe к нему после некоторого времени Котлин заставляет геттер / сеттер рефлексивно