Я понимаю привлекательность чистых функциональных языков, таких как Haskell, где вы можете отслеживать побочные эффекты, такие как дисковый ввод-вывод, используя монад.Что считается побочным эффектом? Почему распределение памяти не является побочным эффектом?
Почему не все системные вызовы считаются побочными эффектами? Например, распределение памяти кучи (которое автоматически) в Haskell не отслеживается. И распределение стека может быть побочным эффектом, хотя я не уверен, что это было бы полезно. Оба они изменяют общее состояние системы.
Так где же линия, нарисованная для того, что является побочным эффектом, а что нет? Это просто то, что является самым «полезным»? Или есть более теоретическая основа?
Я думаю, что самый простой ответ заключается в том, что если распределение было побочным эффектом, очень немногие вещи были бы «чистыми», что уменьшало бы полезность концепции. Чистота не имеет единого универсального строгого определения. Я мог представить себе язык, который * * рассматривал выделение как побочный эффект и управлял им через систему типов, что может быть очень полезно для систем с небольшим объемом памяти (т.е. встроенных систем), но я не знаю ни одного такой язык в настоящее время. –
Распределение памяти является побочным эффектом, если вы хотите контролировать, когда это произойдет. См. Обертки IORef/STRef/FunPtr. Просто, если это происходит автоматически, вы можете доверять своему компилятору, чтобы быть умным, поэтому Haskell не заставляет вас беспокоиться об этом. –
@AlexisKing Как кто-то, кто иногда должен писать код для встроенных систем, это будет действительно интересный язык для просмотра. Я предполагаю, что это может быть написано как DSL в Haskell, но было бы круто, как автономный язык, который был составлен очень эффективно. – bheklilr