Предположим, что
data Foo a = Foo !Int a [a] | Bar [a]
поэтому конструктор Foo строг в своем первом аргументе, который будет распакован. Предположим далее, что я передаю Foo n функции более высокого порядка f и что f не становится вложенным (поэтому Foo n фактически передается). Ядро, которое я получаю с -O2, указывает, что n получает коробку, а затем передается в Foo, и результат передается на f. Мой вопрос: было бы лучше позвонить
f (\a b -> Foo n a b)
чтобы избежать бокса n? Или это может привести к другой проблеме производительности?
Я действительно думал определить
foo' !n = \a b -> Foo n a b
и вызовите f (foo' n), который, как я полагал, должен сделать то же самое, но я думаю, что лучше спросить конкретно.