Я действительно не понимаю, как это оптимизировать, когда кортеж все равно разворачивается.
Это оптимизация: кортеж распаковывается. Итак, программа, которая в конечном итоге запускается, никогда не содержит кортеж вообще, она просто содержит вызов функции с двумя аргументами.
Можно также выразить это более пессимистично: ab initio, кортежи по своей природе плохие для производительности. Это связано с тем, что для аргумента кортежа требуется указатель три : thunk для всего кортежа, thunk для элемента fst
и thunk для элемента snd
. Так что в принципе для производительности очень плохая идея обернуть ваши данные в кортежи. (Лучше поместить это в data
структуры со строгими полями.) То есть, конечно, если вам действительно не нужна лень во всех этих местах.
Однако , и в этом суть цитаты, на практике, как правило, все еще нормально использовать кортежи в GHC, потому что обычно он может оптимизировать косвенное направление, если может доказать, что это не так. необходимо.