Язык и библиотеки Haskell 98

Указания компилятору (псевдокомментарии)

Показывать лекцию целиком

11.1 Встраивание

decl $$\to$$ {-# INLINE qvars #-
decl $$\to$$ {-# NOINLINE qvars #-}

Перевод:

объявление $$\to$$ {-# INLINE список-квалифицированных-переменных #-}
объявление $$\to$$ {-# NOINLINE список-квалифицированных-переменных #-}

Псевдокомментарий INLINE указывает компилятору генерировать указанные переменные на месте их использования. Компиляторы будут чаще автоматически генерировать (встраивать) простые выражения. Это можно предотвратить с помощью псевдокомментария NOINLINE.

11.2. Специализация

decl $$\to$$ {-# SPECIALIZE spec1 , ... , speck #-} (k <- 1)
spec $$\to$$ vars :: type

Перевод:

объявление $$\to$$ {-# SPECIALIZE спецификатор1 , ... , спецификаторk #-} (k <- 1)
спецификатор $$\to$$ список-переменных :: тип

Специализация используется, чтобы избежать неэффективности, связанной с диспетчированием перегруженных функций. Например,

factorial :: Num a => a -> a
factorial 0 = 0
factorial n = n * factorial (n-1)
{-# SPECIALIZE factorial :: Int -> Int,
               factorial :: Integer -> Integer #-}

при обращениях к factorial компилятор может обнаружить, что параметр имеет тип Int или Integer, но он будет использовать специализированную версию factorial, которая не затрагивает перегруженные числовые операции.

Вернуться к учебному плану