4.8Kпросмотров
26 февраля 2025 г.
Score: 5.3K
Системы эффектов Недавно послушал выпуск Подлодки про "Системы эффектов в языках программирования" и решил поделиться некоторыми рандомными рассуждениями на эту тему. "Окраска" функций "Окраской" функций называется некоторая декларация эффектов, содержащихся в функции. В JavaScript есть 2 варианта "окраски" функций: - async — обозначает, что функция асинхронная и позволяет использовать внутри неё оператор await
- — обозначает, что функция является генератором и позволяет использовать внутри неё оператор yield Fun fact: эти 2 варианта можно скомбинировать, чтобы получить AsyncIterator, который можно перебирать оператором for await...of. В языке Nim система эффектов позволяет окрашивать функции любыми эффектами, что выглядит весьма любопытно (на самом деле существует ещё множество языков с такой возможностью, но почему-то мне сразу вспомнился именно Nim). Обработка исключений В Java есть оператор throws, позволяющий "окрасить" функцию эффектом выброса определённого типа исключения и на этапе сборки удостовериться, что эти исключения обработаны. JavaScript/TypeScript не позволяет типизировать исключения (разве что задокументировать их с помощью JSDoc или TSDoc), но теоретически эту проблему можно решить знаменитой монадой Either. Чистота функций Бандлеры используют аннотацию /#PURE*/, которая обозначает отсутствие побочных эффектов в функции, для более эффективного тришейкинга (упомянал об этом в своём докладе). В самом JavaScript нет языкового средства для выражения чистоты функции — то есть отсутствия в ней эффектов, хотя было бы классно использовать это знание, например, для исполнения кода во время сборки (как, например, c babel-plugin-macros).