Почему у Scala нет IO Monad? - PullRequest
       17

Почему у Scala нет IO Monad?

25 голосов
/ 19 февраля 2012

Мне интересно, почему в Scala нет монады ввода-вывода, подобной Haskell.

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

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

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

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

1 Ответ

37 голосов
/ 19 февраля 2012

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

Но если у вас действительно есть приложения, в которых монада ввода-вывода имеет существенные преимущества, ничто не мешает вам написать собственную реализацию или использовать скалаз.См., Например, 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), которые все очень сложные, стабильные и успешные, и не будутбыть легко замененным новичком.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...