He estado haciendo algunos programas funcionales y tengo una pregunta. Tal vez me esté perdiendo algo, pero ¿hay alguna manera de detener una función "reduce()" a mitad de camino? Digamos cuando llego a una cierta condición? La idea de alguna manera parece anti funcional. No he visto ninguna de esas opciones en Python o F #,Detener una operación Reducir() a mitad de camino. Forma funcional de ejecutar la suma de ejecución parcial
A modo de ejemplo, digamos que tengo una lista como [1,2,3,4,5]. Quiero sumar los elementos en esta lista hasta que la suma no sea mayor que un número (digamos 8), y devolver/marcar/almacenar/identificar de alguna manera, la cantidad de elementos que realmente he agregado.
Si nos fijamos en Python, por ejemplo, para la que podría intentar algo así como
reduce(lambda a,b : a if a + b > 8 else a + b, input)
Esto me da la respuesta correcta 6, pero ¿cómo puedo encontrar que me había añadido 3 elementos para llegar aquí. No hay un contador como tal. No puedo hacer asignaciones dentro de lambdas. Creo que F # tiene la misma situación.
Sé que puedo utilizar un bucle o utilizar una función que puede almacenar el estado, etc. Pero lo que sería la forma funcional de hacer/pensar en esto. Reduce() quiere funcionar hasta el final, pero en algún lugar a lo largo de esta línea de procesamiento, o queremos detenerlo (porque no nos importa procesar el resto de los elementos) o al menos tomar nota del lugar donde dejó de preocuparse.
¿Qué es importante para usted, el 3 o el 6? ¿O ambos? ¿Cómo le gustaría usar esta función? Devuelve una tupla - '(num_items, resultado)'? Es una idea clara, pero creo que un ciclo es el código más directo. – Stephen
Ambos son importantes.Quiero saber que puedo tomar 3 elementos y que lo más cerca que puedo llegar a mi límite es 6. Sí, un ciclo sería bastante directo, pero quería ver cómo un programador funcional lo atacaría/pensaría en ello. No puedo devolver una tupla, porque reduce necesita otra int de la función para agregar al siguiente elemento en la lista. – Chaitanya
Con respecto a Python, podría ser posible escribir una función 'filtered_reduce', pero Python sigue siendo un lenguaje imperativo cuyas características funcionales no deberían sobreestimarse. En Python, la llamada a 'reduce' se traduce en un bucle simple de todos modos, por lo que no obtienes nada de ella. – Philipp