Я перехожу через библиотеку векторов и замечаю {-# 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
будет переписан.