Я изучаю Scala прямо сейчас. Я немного знаком с Haskell, хотя не могу утверждать, что знаю его хорошо.
Примечание в скобках для тех, кто не знаком с Haskell
Одна черта, которая мне нравится в Haskell, заключается в том, что не только функции являются гражданами первого класса, но и побочные эффекты (позвольте мне называть их действиями). Действие, которое при выполнении наделит вас значением типа a
, принадлежит определенному типу IO a
. Вы можете передавать эти действия почти так же, как и любое другое значение, и комбинировать их интересными способами.
На самом деле, объединение побочных эффектов — это единственный способ в Haskell что-то с ними сделать, поскольку вы не можете их выполнить. Скорее, программа, которая будет выполнена, представляет собой комбинированное действие, возвращаемое вашей функцией main
. Это ловкий трюк, который позволяет функциям быть чистыми, в то же время позволяя вашей программе делать что-то другое, кроме потребления энергии.
Основное преимущество этого подхода заключается в том, что компилятор знает о частях кода, в которых вы выполняете побочные эффекты, поэтому он может помочь вам отловить с ними ошибки.
Актуальный вопрос
Есть ли в Scala какой-то способ, чтобы компилятор проверял побочные эффекты для вас, чтобы, например, вы гарантированно не выполняли побочные эффекты внутри определенной функции?