INLINE_FUSED прагма в Haskell

Я перехожу через библиотеку векторов и замечаю {-# INLINE_FUSED transform #-}, и мне было интересно, что он делает? Я вижу, что он определен в vector.h, но больше нигде.

Ответ 1

Определения означают, что INLINE_FUSED совпадает с INLINE [1]; INLINE_INNER совпадает с INLINE [0]. [1] и [0] являются стандартными ghc для упорядочения фаз вставки. См. Обсуждение под заголовком 7.13.5.5. Управление фазой в http://www.haskell.org/ghc/docs/7.0.4/html/users_guide/pragmas.html

vector необходимо контролировать этапы, на которых ghc строит различные определения. Сначала он хочет, чтобы все функции функций stream и unstream экспонировались, так что (прежде всего) stream.unstream можно заменить на id, а аналогично в других случаях, в соответствии с (переписать) праймы RULE распространены повсюду.

Типичные векторы к векторным функциям записываются как unstream . f . stream, где f - функция Stream to Stream. unstream строит фактический вектор в памяти от stream; stream читает вещественный вектор в stream. Цель игры - уменьшить количество построенных фактических векторов. Таким образом, состав трех векторных векторных функций

 f_vector . g_vector . h_vector

действительно

 unstream . f_stream . stream . unstream . g_stream . stream . unstream . h_stream . stream

которую он переписал на

 unstream . f_stream . g_stream . h_stream . stream

и т.д. Поэтому мы пишем один новый вектор вместо трех.

Правила для transform немного интереснее этого, но принадлежат к той же тонкой системе упорядочения:

 transform f g (unstream s) = unstream (Bundle.inplace f g s)
 transform f1 g1 (transform f2 g2 p) = transform (f1 . f2) (g1 . g2) p

в https://github.com/haskell/vector/blob/master/Data/Vector/Generic/New.hs#L76

чтобы вы могли видеть, как что-то написано в форме:

unstream . h_stream . stream . transform f1 g1 . transform f2 g2 
                    . unstream . j_stream . stream $ input_vector

будет переписан.