Вдохновлен Длина списка сравнения
Если я хочу найти самый длинный список в списке списков, возможно, самый простой способ:
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]
самый длинный, без необходимости определять всю длину указанного списка. Прав ли я, что это можно сделать стрелками? Если так, то как? Если нет, то почему нет, и как можно реализовать этот подход?