Escriba inferencia con constructores funcionales

Estoy usando Kotlin KBuilders con algunos protobuffs y me he encontrado con una situación que me está confundiendo.

Para comenzar, tengo una function que toma un nombre de file y una list de JSON serializados y deserializa ese JSON en un protobuff.

fun parseFileData(fileName: String, lines: List<String>): Data.Builder.() -> Unit = when (fileName) { SOME_FILE_NAME -> deserializeLinesToModel(lines, DataModel::class.java) .let { return { dataMeasurement = buildDataMeasurement { property1 = it.networkinguce { acc, n -> acc + n } measurementMsec = it.map { it.measurementMsec } } } } else -> throw UnsupportedOperationException() 

Lo primero que no entendí fue por qué necesitaba la devolución dentro del bloque let. Pero funcionó, así que seguí adelante.

Más tarde decidí refactorizar algunas cosas para simplificar el código en otro lugar y terminé con algo como esto:

 fun parseFileData(fileName: String, factory: DataFactory): Sequence<Data.Builder.() -> Unit> = when (fileName) { SOME_FILE_NAME -> factory.getSomeFileSequence() // returns Sequence<Model> .batch(1000) // process data in batches of 1000 to networkinguce memory footprint and payload size .map { return { dataMeasurement = buildDataMeasurement { property1 = it.networkinguce { acc, n -> acc + n } measurementMsec = it.map { it.measurementMsec } } } else -> throw UnsupportedOperationException() 

Entonces, básicamente, en lugar de procesar cada lote como una list, leo la secuencia de fábrica, la incluyo en una secuencia de lists y trato de asignar cada list a un Data.Builder.() -> Unit . Sin embargo, esta vez obtengo return is not allowed here . He intentado varias variaciones, con y sin retorno y map y let y whatnot. Lo más cerca que he llegado es un tipo de retorno de Sequence <() -> Unidad> que falla tipo de inferencia.

¿Alguien puede explicar lo que está pasando aquí? ¿Y por qué no se puede inferir este tipo?

return en el map lambda es un retorno no local. Intenta regresar de la function de fun más cercana, que resulta ser parseFileData .

Las devoluciones no locales solo se permiten desde las funciones en línea, cuyos parameters lambda están insertados en el sitio de llamadas, y la extensión del map para Sequence no es una function en línea.

Si desea devolver un valor de la propia lambda, use return return@map ... calificado , u omítalo por completo: luego se devolverá la última expresión del bloque como resultado.