Сравнение длины списка со стрелками

На основе Сравнение длины списка

Если я хочу найти самый длинный список в списке списков, возможно, самый простой способ:

longestList :: [[a]] -> [a]
longestList = maximumBy (comparing length)

Более эффективным способом было бы предварительное вычисление длин:

longest :: [[a]] -> [a]
longest xss = snd $ maximumBy (comparing fst) [(length xs, xs) | xs <- xss]

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

longest [[1],[1],[1..2^1000],[1],[1]]

В приведенном выше (очень надуманном) примере вам нужно было бы выполнить только два шага по каждому списку, чтобы определить, что список [1..2 ^ 1000] самый длинный, без каких-либо необходимо определить всю длину указанного списка. Я прав, что это можно сделать стрелками? Если да, то как? Если нет, то почему и как можно реализовать этот подход?

6
задан Community 23 May 2017 в 12:27
поделиться