Предположим, что
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)
, который, как я полагал, должен сделать то же самое, но я думаю, что лучше спросить конкретно.