История изменений
Исправление
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