Inspirado por Comparing list lengthComparando longitud de la lista con las flechas
Si quiero encontrar la lista más larga de una lista de listas, la forma más sencilla es probablemente:
longestList :: [[a]] -> [a]
longestList = maximumBy (comparing length)
Una manera más eficiente sería para precalcular las longitudes:
longest :: [[a]] -> [a]
longest xss = snd $ maximumBy (comparing fst) [(length xs, xs) | xs <- xss]
Ahora, quiero dar un paso más. Puede que no sea más eficiente para casos normales, pero ¿puedes resolverlo usando las flechas? Mi idea es, básicamente, recorrer todas las listas al mismo tiempo, y seguir caminando hasta que hayas sobrepasado la longitud de cada lista, excepto la más larga.
longest [[1],[1],[1..2^1000],[1],[1]]
En lo anterior ejemplo (muy artificial), sólo se tendría que dar dos pasos a través de cada lista con el fin de determinar que la lista [1..2^1000]
es la más larga, sin necesitar para determinar la longitud completa de dicha lista . ¿Tengo razón en que esto se puede hacer con flechas? Si es así, ¿cómo? Si no, ¿por qué no, y cómo podría implementarse este enfoque?
No veo ninguna conexión con las flechas. – luqui
@luqui una sección del Wikilibro de Haskell en [Uso de flechas] (http://en.wikibooks.org/wiki/Haskell/Understanding_arrows#Using_arrows) parecía indicar que las flechas eran útiles para el análisis de una manera similar a la mía solución propuesta para este problema (observe el primer elemento de cada lista, luego el segundo, etc.) [Stephen's Arrow Tutorial] (http: //en.wikibooks.org/wiki/Haskell/StephensArrowTutorial) me dieron la misma sensación: que las flechas podrían usarse para profundizar en estas listas y almacenar información a medida que avanzan. –
He aceptado una respuesta, pero si alguien puede preparar una respuesta con flechas, o explicar a fondo por qué las flechas no son pertinentes, entonces ciertamente lo aceptaré. –