Частичное применение строгих конструкторов
Предположим, что
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.