Частичное применение строгих конструкторов

Предположим, что

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

Ответы

Ответ 1

Я открыл билет GHC Trac 12990 для этого. Рейд Бартон и Саймон Пейтон Джонс предположили, что исправление (позволяющее оберточной функции быть встроенным при частичном применении), которое я представил как GHC Phabricator difference D2891, Патч был применен к мастер-ветке и будет включен в GHC 8.2.