2016-03-15 5 views
2

Всегда говорят, что система типа Haskell предотвращает загрязнение чистого кода от загрязняющего кода, так как вы всегда должны указывать IO в сигнатуре типа. Однако является ли это следствием самой системы типов, или это действительно так, что IO(..) не экспортируется?Является ли чистота Haskell в силе системой типов или внедрением IO?

В принципе, не правда ли, что если конструктор типа был доступен, что-то подобное можно было бы сделать?

ioToPure :: IO a -> a 
ioToPure (IO ioValue) = ioValue 
+2

Функции в https://hackage.haskell.org/package/base-4.8.2.0/docs/System-IO-Unsafe.html по существу делают то, что вы описываете, - это очень обескураживает по очевидным причинам –

+0

@KevinW , О да, дух :) Большое спасибо. – BalinKingOfMoria

ответ

4

Да, это в некотором смысле это правда.

Система типа сама по себе ничего не знает о IO и не нуждается в ней. Это разные языковые функции, которые скрывают реальное представление действия IO от пользователей, так что невозможно «просто запустить» действие ввода-вывода.

Так, правда, что безопасность IO в Haskell и сравнимых языках представляет собой комбинированный результат нескольких языковых особенностей и свойств, наиболее заметно:

  • сильный тип системы, которая не принимает «закрыть я знаю лучше »от пользователя.
  • свойство, что все набрано. Я имею в виду, что на нечистых языках у вас есть «заявления», и даже если система типов сильная, она не просматривается после следующей точки с запятой. В то время как в Haskell у нас есть только выражения, и каждый бит каждого выражения получает тип и, в конце концов, влияет на тип функции, в которой происходит выражение.
  • Языковые функции, которые скрывают представление типа.

Тем не менее, я считаю, что выражение «система типов гарантирует, что нечистый и чистый код разделяется» является безвредным упрощением.

+0

Есть ли что-нибудь, что мы можем сделать с этим заблуждением? (Это даже важно?) – BalinKingOfMoria

+0

Позвольте мне добавить мысль или два, @BalinKingOfMoria – Ingo

4

Несомненно, экспорт низкоуровневых примитивов может повредить побочные эффекты. И, да, вы можете получить чистоту только, избегая экспорта каждой опасной вещи. Никаких машин типа типа не требуется.

Однако, без ограничений типа все IO-связанные были бы опасны. Поэтому мы полностью запретили бы ИО. Не очень полезно.

С помощью системы типов мы можем экспортировать некоторые «опасные» IO-действия, зная, что их можно выполнять только в «контролируемых» местах, которые должны иметь тег IO в своем типе. Сделать их более опасными.

Таким образом, чистота исходит из комбинации статических гарантий и тщательного экспорта.