Вместо использования (map head . map orderFitness)
, где orderFitness
- это sortBy
, вы можете использовать maximumBy
и один map
.Это не сильно экономит (так как вы переходите от O (n log n) к O (n) и, возможно, получаете еще один фактор от устранения двойной карты), но по крайней мере несколько проще и эффективнее,Вы также избавились бы от вызова, чтобы полностью изменить.
Сомневаюсь, что это исправит проблему без deepseq
, но, тем не менее, это должно быть улучшение.
Редактировать: если бы стандартная библиотека и GHC были безупречны, то head . sortBy
выдаст код, идентичный maximumBy
, а map head . map sortBy
выдаст код, идентичный map (head . sortBy)
К сожалению, ни одна из этих вещей не можетправда на практике.sortBy
будет иметь тенденцию делать кучу дополнительного выделения памяти, потому что это алгоритм «разделяй и властвуй».Комбинирование карт - это оптимизация, которую вы иногда получаете, но на нее не стоит рассчитывать.
Что более важно, использование maximumBy
более декларативно.Проще увидеть, что делает код и сколько времени это займет.Также должно быть легче воспользоваться преимуществами оптимизации, потому что мы знаем, какова цель, а не только как мы ее достигаем.