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