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 могут иметь огромное влияние на узкие внутренние петли, если их использовать разумно.

11
J. Abrahamson 1 Апр 2014 в 03:06
D'oh, столько раз, сколько я сталкивался с Google, индексирующим действительно старые версии документации, вы могли бы подумать, что я должен проверить свою версию GHC, чтобы увидеть, какая самая последняя.
 – 
Two-Bit Alchemist
1 Апр 2014 в 03:47
1
См. также отчет Haskell 2010: Прагмы компилятора (LANGUAGE прагмы не являются частью отчета 98, но INLINE и NOINLINE есть).
 – 
Zeta
1 Апр 2014 в 13:09

Это прагма . По сути, это то, что не выражается в самом стандарте языка, но все же говорит что-то относящееся к компилятору.

Некоторые из этих прагм по сути необязательны, например, улучшить производительность, отсюда и внешний вид, похожий на комментарии. В вашем примере INLINE означает, что компилятор должен постараться не просто связать с рассматриваемой функцией, но фактически "жестко закодировать" ее везде, где она вызывается. Это в принципе не меняет семантику программы, но может существенно повлиять на производительность и использование памяти (в частности, в сочетании с методами слияния дополнительных потоков и т. Д.).

6
leftaroundabout 1 Апр 2014 в 02:58