LINUX.ORG.RU

История изменений

Исправление 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)).