Подтвердить что ты не робот

Почему у Scala есть IO Monad?

Мне интересно, почему Scala не имеет IO Monad, как Haskell.

Итак, в Scala возвращаемым типом метода readLine является String, тогда как в Haskell сопоставимая функция getLine имеет тип возвращаемого значения IO String.

Существует аналогичный вопрос об этой теме, но его ответ не удовлетворяет:

Использование IO, безусловно, не является доминирующим стилем в scala.

Может кто-нибудь объяснить это немного дальше? Каково было конструктивное решение не включать IO Monads в Scala?

4b9b3361

Ответ 1

Потому что Scala не является чистым (и не имеет средств для обеспечения того, что функция чиста, как и у D) и дает побочные эффекты. Он тесно взаимодействует с Java (например, повторно использует большие части библиотек Java). Scala не ленив, поэтому нет проблем с выполнением порядка, например, в Haskell (например, нет необходимости в >> или seq). В этих условиях введение IO Monad сделало бы жизнь более сложной, не наживаясь.

Но если у вас действительно есть приложения, где монада IO имеет существенные преимущества, ничто не мешает вам писать свою собственную реализацию или использовать scalaz. См. http://apocalisp.wordpress.com/2011/12/19/towards-an-effect-system-in-scala-part-2-io-monad/

[изменить]

Почему это не было сделано как ленивый и чистый язык?

Это было бы совершенно возможно (например, посмотрите Frege, язык JVM очень похож на Haskell). Разумеется, это улучшит совместимость Java, но я не думаю, что это основная причина. Я думаю, что ленивый и чистый язык - это абсолютно здорово, но просто слишком чуждо большинству программистов на Java, которые являются целевой аудиторией Scala. Scala был разработан для взаимодействия с объектной моделью Java (которая является полной противоположностью чистой и ленивой), позволяя функциональное и смешанное программирование с функциональным OO, но не применяя его (что бы преследовало почти всех программистов на Java). На самом деле нет смысла иметь еще один полностью функциональный язык: есть Haskell, Erlang, F # (и другие ML) и Clojure (и другие схемы /Lisps ), которые все очень сложные, стабильные и успешные, и выиграли 'легко заменить новичком.