-- | /O(n)/ Drop elements that do not satisfy the predicate
filter :: Vector v a => (a -> Bool) -> v a -> v a
{-# INLINE filter #-}
filter f = unstream . inplace (MStream.filter f) . stream
Более конкретно, что делает конкретная линия?
{-# INLINE filter #-}
2 ответа
GHC имеет систему «прагм», которая позволяет вам указывать экстралингвистическую информацию для GHC. В частности, они выглядят как
{-# <NAME> <ARGS...> #-}
Чаще всего вы увидите прагмы языковых расширений, которые должны находиться в верхней части файла и влиять на языковые расширения, действующие для остальной части файла.
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Example where
Обычно должно быть так, что игнорирование прагмы не влияет на смысл программы. Это в целом верно для прагм, таких как INLINE
, поскольку они просто намекают компилятору на то, что тело этой функции должно быть встроено везде, где бы она ни вызывалась, чтобы открыть новые возможности оптимизации. Семантика Haskell дает нам гарантии относительно того, когда такие встраиваемые преобразования не изменяют смысл программы, поэтому выбор компилятора относительно того, встраивать или нет, не влияет на смысл программы (при условии, что он не нарушает предположения об этих гарантиях).
Прагмы LANGUAGE
немного отличаются тем, что они точно определяют, на каком языке пишется остальная часть файла. Например, мы обычно предполагаем, что базовым языком является Haskell98
или Haskell2010
, а прагмы LANGUAGE
добавляют расширения, так что язык файла с заголовком, приведенный ранее в качестве примера, является
Haskell2010 + RankNTypes + FlexibleInstances + ScopedTypeVariables
Но кроме указания компилятору, на каком языке пишется, эта прагма не имеет дальнейшего значения.
Полный набор допустимых прагм зависит от используемого компилятора. Здесь перечислены прагмы GHC (обратите внимание, что эта ссылка предназначена для версии 7.6. .3, а ссылка в комментариях относится к версии 7.0.3). Использование прагм, отличных от LANGUAGE
, может быть схематичным и зависеть от платформы, поэтому внимательно изучите их использование и значение.
Например, ведутся большие споры о том, следует ли авторам библиотек использовать INLINE
, поскольку это указывает на неверие в собственную эвристику встраивания GHC и, таким образом, нам следует потратить больше усилий на их ужесточение, а не на засорение кода руководство INLINE
s. Но при этом INLINE
и INLINABLE
могут иметь огромное влияние на узкие внутренние петли, если их использовать разумно.
LANGUAGE
прагмы не являются частью отчета 98, но INLINE
и NOINLINE
есть).
Это прагма . По сути, это то, что не выражается в самом стандарте языка, но все же говорит что-то относящееся к компилятору.
Некоторые из этих прагм по сути необязательны, например, улучшить производительность, отсюда и внешний вид, похожий на комментарии. В вашем примере INLINE
означает, что компилятор должен постараться не просто связать с рассматриваемой функцией, но фактически "жестко закодировать" ее везде, где она вызывается. Это в принципе не меняет семантику программы, но может существенно повлиять на производительность и использование памяти (в частности, в сочетании с методами слияния дополнительных потоков и т. Д.).
Похожие вопросы
Новые вопросы
haskell
Haskell — это чисто функциональный язык программирования со строгой статической типизацией, отложенными вычислениями, обширной поддержкой параллелизма и параллелизма, а также уникальными возможностями абстракции.