LINUX.ORG.RU

История изменений

Исправление dave, (текущая версия) :

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

Например, если у функции есть ограничения по параметрическим классам типов, то такую функцию желательно снабдить прагмой INLINABLE или иногда INLINE. Это приведет к тому, что псевдокод исходной функции будет зашит в бинарной библиотеке (чем-то аналогично атрибуту ReflectedDefinition в F#).

Потом, при использовании соответствующей бинарной библиотеки из приложения или какой совсем другой библиотеки для исходного кода той самой функции может произойти inlining на этапе компиляции.

В Scala и Java есть похожие штуки, но я их особо не щупал в отличие от описанной возможности в Haskell, которая замечательно работает.

Ну, и вдобавок. В Haskell ссылочная прозрачность. А потому инлайнить можно совершенно безопасно и в любых количествах где-угодно и как угодно. Ничего подобного даже близкого нет ни в JVM, ни в Си в силу фундаментальных ограничений. А те немногие, кто используют вынужденно unsafePerformIO, должны часто использовать прагму NOINLINE

Исходная версия dave, :

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

Например, если у функции есть ограничения по монадическим трансформерам или каким другим параметрическим типам, то такую функцию желательно снабдить прагмой INLINABLE или иногда INLINE. Это приведет к тому, что псевдокод исходной функции будет зашит в бинарной библиотеке (чем-то аналогично атрибуту ReflectedDefinition в F#).

Потом, при использовании соответствующей бинарной библиотеки из приложения или какой совсем другой библиотеки для исходного кода той самой функции может произойти inlining на этапе компиляции.

В Scala и Java есть похожие штуки, но я их особо не щупал в отличие от описанной возможности в Haskell, которая замечательно работает.

Ну, и вдобавок. В Haskell ссылочная прозрачность. А потому инлайнить можно совершенно безопасно и в любых количествах где-угодно и как угодно. Ничего подобного даже близкого нет ни в JVM, ни в Си в силу фундаментальных ограничений. А те немногие, кто используют вынужденно unsafePerformIO, должны часто использовать прагму NOINLINE