История изменений
Исправление quasimoto, (текущая версия) :
{-# INLINE sum #-} или {-# INLINABLE sum #-} в Data.List что-то сломает? И sum в любом случае и так левый/хвостовой, foldr/build никак не задействует.
Вообще опыт показывает, что точно такой же sum как в base, но в модуле пакета в котором находится клиентский код, либо такой же sum с INLINE/INLINABLE в модуле внешнего по отношению к клиентскому коду пакета, установленного по cabal install, начиная с -O1 ведёт себя нормально — как твой sum_foldl/sum_foldl'. То есть проблема в том, что не видны сорцы sum, INLINE/INLINABLE это решают.
Та же история с обобщением до Num и SPECIALISE.
для ленивых данных левая свертка, для строгих и deforestation - правую.
Может наоборот? sum, product — очевидно левые/хвостовые, так как тупо циклы с _коммутативной_ операцией, partition, unzip, unwords — правые/рекурсивные-over-cons, так как _порядок_ добавления элементов из ленивого потока играет роль (take 5 $ fst $ partition odd [1 ..], take 5 $ fst $ unzip $ let xs = (1, 1) : xs in xs, interact (unwords . take 5 . words)).
Исправление quasimoto, :
{-# INLINE sum #-} или {-# INLINABLE sum #-} в Data.List что-то сломает? И sum в любом случае и так левый/хвостовой, foldr/build никак не задействует.
Вообще опыт показывает, что точно такой же sum как в base, но в модуле пакета в котором находится клиентский код, либо такой же sum с INLINE/INLINABLE в модуле внешнего по отношению к клиентскому коду пакета, установленного по cabal install, начиная с -O1 ведёт себя нормально — как твой sum_foldl/sum_foldl'. То есть проблема в том, что не видны сорцы sum, INLINE/INLINABLE это решают.
Та же история с обобщением до Num и SPECIALIZE.
для ленивых данных левая свертка, для строгих и deforestation - правую.
Может наоборот? sum, product — очевидно левые/хвостовые, так как тупо циклы с _коммутативной_ операцией, partition, unzip, unwords — правые/рекурсивные-over-cons, так как _порядок_ добавления элементов из ленивого потока играет роль (take 5 $ fst $ partition odd [1 ..], take 5 $ fst $ unzip $ let xs = (1, 1) : xs in xs, interact (unwords . take 5 . words)).
Исходная версия quasimoto, :
{-# INLINE sum #-} или {-# INLINABLE sum #-} в Data.List что-то сломает? И sum в любом случае и так левый/хвостовой, foldr/build никак не задействует.
Вообще опыт показывает, что точно такой же sum в модуле пакета в котором находится клиентский код, либо такой же sum с INLINE/INLINABLE в модуле внешнего по отношению к клиентскому коду пакета, установленного по cabal install, начиная с -O1 ведёт себя нормально — как твой sum_foldl/sum_foldl'. То есть проблема в том, что не видны сорцы sum, INLINE/INLINABLE это решают.
Та же история с обобщением до Num и SPECIALIZE.
для ленивых данных левая свертка, для строгих и deforestation - правую.
Может наоборот? sum, product — очевидно левые/хвостовые, так как тупо циклы с _коммутативной_ операцией, partition, unzip, unwords — правые/рекурсивные-over-cons, так как _порядок_ добавления элементов из ленивого потока играет роль (take 5 $ fst $ partition odd [1 ..], take 5 $ fst $ unzip $ let xs = (1, 1) : xs in xs, interact (unwords . take 5 . words)).