On Thu, Oct 10, 2019 at 6:32 PM Sergei M. Abramov abram_AT_botik.ru < refal@botik.ru> wrote:
> > Вот, хочу сказать, что меня удивило: > > ns' = filter (\ k -> (gcd pp k) == 1) ns > > работает немного медленнее, чем > > ns' = filter ((== 1).(gcd pp)) ns > > Вот нифига ж себе? > В голову приходит такая гипотеза: ко второму варианту успешно применяются какая-нибудь дефорестация, а на первом она ломается, так как второй удовлетворяет некоторому шаблону (в аргументе fold'а композиция закарренных функций), а первый воспринимается как общий вид и оставляется как есть. Конечно, нам суперкомпиляторщикам это странно: оба выглядят так, что неглубокая суперкомпиляция по простой стратегии должна их брать. Кстати, меня все-таки удивляет, что Simon P-J со своим аспирантом Maximilian Bolingbroke не смогли подобрать вариант суперкомпиляции, который работал бы в GHC за разумное время, как хотел Simon (он об этом говорил). Подозрение такое: если остановится на достаточно простых свистке и обобщении, то не набирался диссер Bolingbroke'у. А когда увлеклись "научностью" для диссера (он весьма солидный) <https://www.cl.cam.ac.uk/techreports/UCAM-CL-TR-835.pdf>, то не получилось устойчиво (по времени) работающего свистка. А может они потом сделали в GHS более богатую версию дефростации, которая впитала какие-то идеи суперкомпиляции. Не знаю. Не натыкался на соответствующие работы. Всего наилучшего, Андрей