Я наткнулся на следующее предложение на Real World Haskell:
Ленивое вычисление имеет пугающие эффекты. Допустим, мы хотим найти k наименьших значений в несортированном списке. На традиционном языке очевидным подходом было бы отсортировать список и взять первые k элементов, но это дорого. Вместо этого для повышения эффективности мы бы написали специальную функцию, которая принимает эти значения за один проход, и ей придется выполнять умеренно сложный учет. В Haskell подход «сортировка, затем получение» на самом деле работает хорошо: лень гарантирует, что список будет отсортирован только для того, чтобы найти k минимальных элементов.
И они дают для этого реализацию кода:
minima k xs = take k (sort xs)
Но так ли это? Я думаю, что даже в Haskell он должен делать полный список, чтобы удалить k
элементы. (Представьте, что в конце списка находится наименьшее число). Я что-то упустил?
xs
, но она не должна завершать работу по сортировкеxs
. - person Louis Wasserman   schedule 09.10.2013sort
в GHC - это сортировка слиянием. знак равно - person Daniel Wagner   schedule 09.10.2013